char ** обратный вызов из c ++ в C # и отправка данных обратно

У меня проблема, и я надеюсь, что вы, ребята, сможете мне помочь с этим. Я относительно новичок в программировании на 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.

Любая помощь?
Спасибо

1

Решение

Обычно, когда вы видите char**, это означает «Этот параметр будет использоваться для возврата строки».

При написании P / Invoke для такого аргумента вы обычно можете использовать ref string (если строка является входной или входной и выходной) или out string (если строка выводится только).

Еще одна вещь, которую вам нужно знать, — ожидает ли нативный метод строки ANSI или Unicode.

Чтобы указать, какую строковую кодировку использовать, используйте CharSet параметр атрибута:

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

или же

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

и так далее.

1

Другие решения

Я не так хорош в C #, но не pIPAddr указатель на строку?

Таким образом, вы должны объявить этот параметр как ref string pIPAddr,

0

По вопросам рекламы [email protected]