Передача указателя на функцию в DLL - PullRequest
2 голосов
/ 26 января 2012

У меня серьезная проблема. У меня есть код 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

Дополнительная информация: Попытка чтения или записи в защищенную память. Это часто указывает на то, что другая память повреждена.

Есть ли способ, которым это можно решить?

1 Ответ

0 голосов
/ 26 января 2012

ОК, проблема решена, ошибка была намного более очевидной, чем я когда-либо думал: возвращаемое значение _SendFunc(...) было не int, а long, и это вызвало сообщение выше.

Извините за вопрос, а также спасибо за помощь всем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...