繁体   English   中英

C#包装器和回调

[英]C# wrapper and Callbacks

我正在为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)  

争论
-ulWindowhandle-传递给ViewerSDK在此处显示视频和消息的窗口的句柄
-strUser1 / 2-要登录的用户名。如果仅使用单个用户登录,则strUser2为
- 空值
-strPwd1 / 2-两个用户的密码。 如果strUser2为NULL,则strPwd2将被忽略。

返回
此函数创建必须传递的SessionHandle

打回来
pParameter的结构如下:
-无符号长ulFunctionID
-unsigned long 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);

我创建连接功能

[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是(我相信)32位,并且映射到C# int
同样,在调用函数之后,必须对传递的委托实例进行托管引用,以确保不会垃圾收集委托。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM