У меня проблема, и я надеюсь, что вы, ребята, сможете мне помочь с этим. Я относительно новичок в программировании на 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.
Любая помощь?
Спасибо
Обычно, когда вы видите char**
, это означает «Этот параметр будет использоваться для возврата строки».
При написании P / Invoke для такого аргумента вы обычно можете использовать ref string
(если строка является входной или входной и выходной) или out string
(если строка выводится только).
Еще одна вещь, которую вам нужно знать, — ожидает ли нативный метод строки ANSI или Unicode.
Чтобы указать, какую строковую кодировку использовать, используйте CharSet
параметр атрибута:
[DllImport("MyDLL.dll", CharSet = CharSet.Unicode)]
или же
[DllImport("MyDLL.dll", CharSet = CharSet.Ansi)]
и так далее.
Я не так хорош в C #, но не pIPAddr
указатель на строку?
Таким образом, вы должны объявить этот параметр как ref string pIPAddr
,