【问题标题】:C# wrapper and CallbacksC# 包装器和回调
【发布时间】:2010-03-12 02:18:37
【问题描述】:

我正在为 Dallmeier 通用 API 灯(摄像机和监视系统)编写 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 是
- 空
- strPwd1/2 - 两个用户的密码。如果 strUser2 为 NULL,则忽略 strPwd2。

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

回调
pParameters 将被结构化:
- 无符号长 ulFunctionID
- unsigned long ulSocketHandle, //已建立连接的套接字句柄
- 无符号长 ulWindowHandle,
- int SessionHandle, //创建的会话的会话句柄
- const char * strIP,
- const char* strUser1,
- const char* strPwd1,
- const char* strUser2,
- 常量字符 * 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 期望返回值?

【问题讨论】:

  • 你的回调方法需要匹配委托类型的签名。然后你会写new DallmeierSDK.DallmeierCallback(SomeMethodName)。
  • 感谢 SLaks。我得到了这个工作。

标签: c# callback wrapper


【解决方案1】:

你基本上是在正确的轨道上。

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

【讨论】:

  • +1 用于提及参考。有一次我忘了保留对代表的引用……这很有趣。 :)
  • 感谢您的及时回复。我已经对帖子进行了编辑,并将长整数更改为整数。我是否使用 - GCHandle.Alloc - 来保留托管引用?
  • 或者只是在你的班级中创建一个字段(假设班级会持续足够长的时间)
  • 我已经编辑了我的帖子,以包含有关调用我遇到问题的函数的详细信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-17
  • 1970-01-01
  • 2018-03-12
  • 1970-01-01
相关资源
最近更新 更多