после прочтения и обучения в течение многих лет на этой великолепной платформе теперь мой первый пост.Соглашения о вызове DLL и нарушение прав доступа
Моя проблема:
В C++ Я пытаюсь создать динамическую библиотеку (32 бит), который будет служить в качестве клиента AQMP связи (на основе SimpleAmqpClient). Затем файл dll будет использоваться внутри стороннего приложения (32 бит).
Во время моих тестов, когда я вызываю DLL в пользовательский исполняемый файл, все работает нормально. Но когда я пытаюсь использовать dll в стороннем приложении, я получаю ошибку нарушения доступа (0x00000000). Я узнал, что проблема может быть вызовом вызова функции.
С помощью нескольких строк кода, представленных ниже, эта ошибка может быть воспроизведена. Он исчезает, если я удаляю выражение __stdcall
в mytest.dll. Обычно я ожидаю, что код будет работать, потому что он использует одно и то же соглашение о вызовах в custom_test.exe и mytest.dll. (Sidenote: стороннее приложение ожидает функцию __stdcall
, поэтому я полагаюсь на это)
Я хотел бы понять это поведение. Заранее спасибо!
Мои настройки:
- ОС: Windows 7
- 32 бит Компилятор: GCC 5.3 (Cygwin)
Мой код (custom_test.exe):
#include <stdio.h>
#include <windows.h>
int main(void) {
HINSTANCE hInstance;
hInstance=LoadLibrary("mytest.dll");
FARPROC lpfnGetProcessID = GetProcAddress(HMODULE(hInstance), "test");
// Function prototype
typedef void (__stdcall *myFunction)(void);
myFunction test;
test = myFunction(lpfnGetProcessID);
// Call Function
test();
FreeLibrary(hInstance);
}
Мой код (mytest.dll):
extern "C" __declspec(dllexport) void __stdcall test(void) {
printf("Inside Function \n");
}
компилировать код с помощью
- дллы:
g++ mytest.cpp -o mytest.dll -shared -std=gnu++11
- ех:
g++ custom_test.cpp -o custom_test.exe -std=gnu++11
Thx для вашего ответа! В моем первом посте я просто хотел показать большую картину моей задачи. Ошибка может быть воспроизведена только с заданным кодом и без каких-либо дополнительных зависимостей (сторонняя библиотека или приложение). – wolfspex
Обновлен ответ - см. EDIT –