У меня возникла серьезная проблема. У меня есть код C#, который загружает DLL, закодированную в C, которая вызывает DLL, закодированную на C++. Все нормально, пока я не хочу передавать указатель массива от уровня C до уровня C++.Передача указателя на функцию в DLL
Вызывающий код в 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
Дополнительная информация: Попытка чтения или записи защищенной памяти. Это часто свидетельствует о том, что другая память повреждена.
Это способ, которым это можно решить?
Как 'UssSend()' знает размер массива, на который указывает 'msg'? 'serialDLL()' принимает параметр 'msgLength', который (предположительно) содержит число элементов, на которые указывает' msg'. – hmjd
Вы также можете быть заинтересованы в [этой статье, относящейся к NXCOMPAT и DEP] (http://blogs.msdn.com/b/ed_maurer/archive/2007/12/14/nxcompat-and-the-c-compiler.aspx). – hmjd
Вероятно, вы должны показать нам метод багги, а не тот, который называет его ... – Nuffin