char **从c ++回调到C#并发回数据

时间:2013-10-28 08:43:27

标签: c# c++ marshalling intptr

我遇到了问题,希望你们能帮我解决这个问题。我对C#编程比较陌生,从未使用过c ++,所以我无法弄清楚以下问题:

我正在使用SDK(在c ++中编写)来接收和请求来自特定类型设备的DDNS更新。设置回调正在运行,并且在预期时间触发回调。

文档说回调包含char **参数,但我不知道如何处理这个问题。我尝试了很多选项,应用程序不会崩溃的唯一方法是使用IntPtr作为该参数。但是当我这样做时,我无法为该IntPtr设置一个值。

我使用回调找到的原始代码:

int CALLBACK CBGetDeviceAddr(int *pResult, char** pIPAddr,unsigned short *pSdkPort, char *szDeviceID, char*szDeviceName)   
{   
int nCount=g_pDeviceList->GetItemCount();   
memset(g_szIPAddr, 0, MAX_IP_LEN+1);   
*pIPAddr=g_szIPAddr;   

BOOL bRet=FALSE;   
for(int i = 0; i< nCount; i++)   
{   

    if (strcmp(szDeviceID,(LPCTSTR)g_pDeviceList->GetItemText(i, 2).GetBuffer(0)) == 0)//,g_pDeviceList->GetItemText(i,2).GetLength()   
    {   
        *pResult=1;   
        strcpy(*pIPAddr,g_pDeviceList->GetItemText(i,0).GetBuffer(0));   
        *pSdkPort = atoi(g_pDeviceList->GetItemText(i,4).GetBuffer(0));   
        TRACE("CALLBACK CBGetDeviceAddrInfo:in DeviceID=%s, DeviceName=%s,out DeviceIP=%s,DevicePort = %d\n",\   
            szDeviceID, szDeviceName, *pIPAddr, *pSdkPort);   
        bRet = TRUE;   
        break;   
    }   
}   

if (!bRet)   
{   
    *pResult=0;   
    *pIPAddr=NULL;   
    TRACE("CALLBACK CBGetDeviceAddrInfo:in DeviceID=%s, DeviceName=%s,out no such device online!!!\n",\   
        szDeviceID, szDeviceName);   
}   

return 0;   
}

我目前使用的是:

private int CBF_GetADeviceIP(ref int pResult, ref IntPtr pIPAddr, ref ushort pSdkPort, string szDeviceID, string szDeviceName)

这适用于pResult和pSdkPort(所以我可以发回数据)但不能对pIPAddr做任何事情。

有任何帮助吗? 感谢

2 个答案:

答案 0 :(得分:1)

通常,当您看到char**时,表示“此参数将用于返回字符串”。

在为这样的参数编写P / Invoke时,通常可以使用ref string(如果输入字符串,或输入和输出)或out string(如果仅输出字符串)。

您需要知道的另一件事是本机方法是否需要ANSI或Unicode字符串。

要指定要使用的字符串编码,请使用CharSet属性参数:

[DllImport("MyDLL.dll", CharSet = CharSet.Unicode)]

[DllImport("MyDLL.dll", CharSet = CharSet.Ansi)]

等等。

答案 1 :(得分:0)

我对C#不是很好,但是pIPAddr不是指向字符串的指针吗?

因此,您应该将该参数声明为ref string pIPAddr