Проблемы со стеком при вызове DLL, скомпилированной с Visual C ++ в GCC - PullRequest
0 голосов
/ 31 мая 2009

Я пытаюсь вызвать некоторые функции в DLL, скомпилированной (я верю) из Visual C ++ из моей программы, скомпилированной с помощью GCC.

Чтобы вызвать функции в DLL, я делаю LoadLibrary () для DLL, а затем GetProcAddress (), чтобы получить адрес конкретной функции, которую я затем вызываю. Эта функция возвращает список указателей на функции в той DLL, которую я вызываю.

Ну, когда я пытаюсь вызвать эти функции, они не работают должным образом. Я прогнал мою программу через отладчик, и похоже, что функция библиотеки DLL ищет один из переданных аргументов в ebp + 8, хотя GCC поставил его в ebp-24.

Это определенно похоже на проблему стека. Более того, когда программная функция GCC, которая вызывает функцию DLL, возвращается, моя программа аварийно завершает работу, поэтому в стеке происходит что-то неуверенное. Кто-нибудь знает, что мне нужно сделать, чтобы это исправить? Я не могу получить доступ к коду DLL.

Также: я попытался поместить __cdecl и __stdcall до определения функции DLL в исходном файле моей программы, но это ничего не меняет.

1 Ответ

2 голосов
/ 31 мая 2009

Похоже, проблема соглашения о вызовах. Убедитесь, что вы помещаете тег соглашения о вызовах в нужное место. С GCC это должно выглядеть так:

typedef int (__stdcall *MyFunctionType)(int arg1, const char *arg2);
MyFunctionType myFunction = (MyFunctionType)GetProcAddress(myModule, "MyFunction");
// check for errors...
int x = myFunction(3, "hello, world!");

[EDIT]

Похоже, ваша проблема не имеет ничего общего с соглашениями о вызовах (хотя их правильное определение важно ) Вы неправильно используете BSTR s - BSTR это , а не простой char* указатель. Это указатель на строку Unicode (wchar_t*), и, кроме того, префикс длиной 4 байта скрыт перед первыми символами строки. См. MSDN для получения полной информации. Итак, вызов SetLicense() должен выглядеть так:

BSTR User = SysAllocString(L"");  // Not sure if you can use the same object here,
BSTR Key = SysAllocString(L"");   // that depends on if SetLicense() modifies its
                                  // arguments; using separate objects to be safe
// check for errors, although it's pretty unlikely
(textCapLib.sdk)->lpVtbl->SetLicense((textCapLib.sdk), User, Key);
SysFreeString(User);  // Hopefully the SDK doesn't hang on to pointers to these
SysFreeString(Key);   // strings; if it does, you may have to wait until later to
                      // free them
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...