У меня серьезная проблема. У меня есть код C #, который загружает DLL, написанную на C, которая вызывает DLL, написанную на C ++. Все хорошо, пока я не хочу передать указатель массива с уровня C на уровень C ++.
Код вызова в C следующий:
#include <windows.h>
#include <winbase.h>
#include <windef.h>
int sendDLL( int* , int );
typedef int (*SendFunc)(int*);
int sendDLL( int* msg , int msgLength )
{
int status = 0;
SendFunc _SendFunc;
HINSTANCE serialLibrary = LoadLibrary("sender.dll");
if (serialLibrary)
{
_SendFunc = (SendFunc)GetProcAddress(serialLibrary, "UssSend");
if (_SendFunc)
{
status = _SendFunc(msg);
}
FreeLibrary(serialLibrary);
}
return status;
}
Теперь реальный поворот в том, что передачи указателя недостаточно: переданное сообщение будет перезаписано в DLL, и нам нужно будет прочитать его еще раз, пока не вернется _SendFunc(...)
.
Если я запускаю программу из Visual Studio (самый высокий уровень - C #), я получаю следующее право при вызове status = _SendFunc=(msg);
(это точно, если закомментировано, ошибки не возникает.)
Произошло необработанное исключение типа «System.AccessViolationException» в TestRS232.exe
Дополнительная информация: Попытка чтения или записи в защищенную память. Это часто указывает на то, что другая память повреждена.
Есть ли способ, которым это можно решить?