C#包装器和回调

时间:2010-03-12 02:18:37

标签: c# callback wrapper

我正在为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的窗口句柄,用于显示视频和消息 - strUser1 / 2 - 要登录的用户的名称。如果仅使用单用户登录,则strUser2为
- NULL
- strPwd1 / 2 - 两个用户的密码。如果strUser2为NULL,则忽略strPwd2。

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

回调
pParameters将结构化:
- 无符号长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是一个指向整数的指针,表示操作的结果。成功归零。 负值是错误代码。

因此,从我在Net和Stack Overflow上看到的内容 - 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期待一个返回值?

1 个答案:

答案 0 :(得分:2)

你大部分时间都在正确的轨道上。

但是,C long是(我相信)32位,并映射到C#int s。 此外,在调用该函数之后,您必须保留对传递的委托实例的托管引用,以确保委托不会被垃圾回收。