C#包装器和回调
我正在为Dallmeier Common API灯(Camera&Surviellance系统)编写C#包装器,之前我从未编写过包装器,但我使用了Canon EDSDK C#包装器。 所以我使用Canon包装器作为编写Dallmeier包装器的指南。
我目前遇到包装回调的问题。 在API手册中,它具有以下内容:
dlm_connect
int(unsigned long uLWindowHandle, const char * strIP, const char* strUser1, const char* strPwd1, const char* strUser2, const char* strPwd2, void (*callback)(void *pParameters, void *pResult, void *pInput), void * pInput)
参数
– ulWindowhandle – 传递给ViewerSDK以在那里显示video和消息的窗口句柄
– strUser1 / 2 – 要登录的用户的名称。如果仅使用单用户登录,则strUser2为
– 空值
– strPwd1 / 2 – 两个用户的密码。 如果strUser2为NULL,则忽略strPwd2。
返回
此函数创建一个必须传递的SessionHandle
打回来
pParameters将结构化:
– unsigned long ulFunctionID
– unsigned long ulSocketHandle,//处理已建立连接的套接字
– unsigned long ulWindowHandle,
– int SessionHandle,//创建的会话的会话句柄
– const char * strIP,
– const char * strUser1,
– const char * strPwd1,
– const char * strUser2,
– const char * strPWD2
pResult是一个指向整数的指针,表示操作的结果。 成功归零。 负值是错误代码。
因此,从我在网络上看到的内容和Stack Overflow – C#使用委托来进行回调。 所以我创建了一个我的回调函数:
public delegate uint DallmeierCallback(DallPparameters pParameters, IntPtr pResult, IntPtr pInput);
我创建了连接function
[DllImport("davidapidis.dll")] public extern static int dlm_connect(int ulWindowHandle, string strIP, string strUser1, string strPwd1, string strUser2, string strPwd2, DallmeierCallback inDallmeierFunc
并且(我认为)DallPParameters作为结构:
[StructLayout(LayoutKind.Sequential)] public struct DallPParameters { public int ulfunctionID; public int ulsocketHandle; public int ulWindowHandle; ... }
所有这些都在我的包装类中。
我是朝着正确的方向前进还是完全错了?
然后在我的Dallmeier课程中,我有以下内容:
private DallmeierAPI dallmeierAPI; private DallmeierSDK.DallmeierCallback dallCallbackHandler; private GCHandle handle; private IntPtr pResult; private IntPtr pInput; internal Dallmeier() { this.dallmeierAPI = DallmeierAPI.Instance; registerEvents(); } private void registerEvents() { // Register Callback Events dallCallbackHandler = new DallmeierSDK.DallmeierCallback(pParameters, pResult, pInput); // Error: Method Name expected handle = GCHandle.Alloc(dallCallbackHandler); } private void unregisterEvents() { handle.Free(); } private DallmeierSDK.DallPParameters pParameters(int ulfunctionID, int ulSocketHandl, int ulWindowHandle, int SessionHandle, string strIP, string strUser1, string strPwd1, string strUser2, string strPwd) { // what goes in here : Error not all code paths return a value } }
所以当我注册回调时,它说的是一个预期的方法名称?
和pParameters期待一个回报值?
你大部分时间都在正确的轨道上。
但是,C long
s(我相信)是32位,并映射到C# int
s。
此外,在调用函数之后,必须保留对传递的委托实例的托管引用,以确保委托不会被垃圾回收。
上述就是C#学习教程:C#包装器和回调分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1041774.html