fer*_*rgs 5 c# callback wrapper
我正在为Dallmeier Common API light(相机和监控系统)编写C#包装器,并且之前从未编写过包装器,但是我使用了Canon EDSDK C#包装器。因此,我使用佳能包装纸作为编写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)
Run Code Online (Sandbox Code Playgroud)
参数
- ulWindowhandle -传递给ViewerSDK显示视频和消息有窗口的句柄
- strUser1 / 2 -用户的姓名登录如果只使用单一用户登录strUser2是。
-空
- strPwd1 / 2 -密码的两个用户。如果strUser2为NULL,则strPwd2将被忽略。
返回
值此函数创建必须传递的SessionHandle
回调
pParameter的结构如下:
-无符号长ulFunctionID-
无符号长ulSocketHandle,//已建立连接的套接字的句柄
-无符号长ulWindowHandle,-int
SessionHandle,//创建的会话的会话句柄
-const char * strIP,-const
char * strUser1,-const
char * strPwd1,-const char * strUser2,
-const
char * strPWD2
pResult是一个指向整数的指针,表示操作的结果。零成功。负值是错误代码。
因此,从网上和堆栈溢出的内容中我可以读到-C#使用委托进行回调。所以我创建了我的回调函数:
public delegate uint DallmeierCallback(DallPparameters pParameters, IntPtr pResult, IntPtr pInput);
Run Code Online (Sandbox Code Playgroud)
我创建连接功能
[DllImport("davidapidis.dll")]
public extern static int dlm_connect(int ulWindowHandle, string strIP, string strUser1, string strPwd1, string strUser2, string strPwd2, DallmeierCallback inDallmeierFunc
Run Code Online (Sandbox Code Playgroud)
和(我认为)DallPParameters作为一个结构:
[StructLayout(LayoutKind.Sequential)]
public struct DallPParameters
{
public int ulfunctionID;
public int ulsocketHandle;
public int ulWindowHandle;
...
}
Run Code Online (Sandbox Code Playgroud)
所有这些都在我的包装器类中。
我是朝着正确的方向前进还是这完全错误?
然后在我的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
}
}
Run Code Online (Sandbox Code Playgroud)
因此,当我注册回调时,它说的是“方法名称”吗?
和pParameters期望返回值?
你基本上走在正确的轨道上。
然而,Clong是(我相信)32 位的,并且映射到 C# int。
此外,调用函数后,您必须保留对传递的委托实例的托管引用,以确保委托不会被垃圾收集。