我遇到了问题,希望你们能帮我解决这个问题。我对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做任何事情。
有任何帮助吗? 感谢
答案 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
。