Проблема создания / вызова DLL - PullRequest
0 голосов
/ 19 июня 2010

Я пытаюсь создать DLL, которая позже будет использоваться в Inno Setup.Мне удалось создать DLL с использованием Pelles в качестве IDE со следующим кодом:

#include <windows.h>

__declspec(dllexport) int sumT(){
   return 2;
}

Затем я вызываю сопоставление DLL с функцией в Inno Setup, используя следующий код Delphi:

function Hellow() : Integer ;
external 'sumT@files:yyy.dll stdcall';

Он работает, как и ожидалось, возвращает 2. Я также могу вызвать его из rundll32.exe - если я добавлю MsgBox в DLL, он появится, доказывая, что все работает как положено.

Теперьпроблема начинается, когда я пытаюсь передать значение в DLL, например:

#include <windows.h>

__declspec(dllexport) int sumT(int sumTah){
   return sumTah;
}

Он перестает работать!В Inno Setup я выдаю сообщение:

«Ошибка времени выполнения (при -1: 0)»

И если я попробую rundll32.exe, я получу:

Ошибка в yyy.dll

Отсутствует запись: sumT

Я не собираюсь вставлять сюда код Delphi, потому что практически все перепробовалТо же самое с кодом C, я попытался использовать вместо этого __stdcall, объявив аргумент как INT, UINT ... и другие вещи, которые я забыл.

Я также посмотрел MSDN, но не смог найти ничего, относящегося кэта конкретная проблема.

Итак, кто-нибудь может помочь?

Спасибо

РЕДАКТИРОВАТЬ: я компилирую в C, поэтому нет необходимости для "extern".

Ответы [ 3 ]

2 голосов
/ 19 июня 2010

Экспортированное имя, вероятно, не соответствует тому, как вы думаете, как оно выглядит. Используйте dumpbin.exe / exports в DLL, чтобы увидеть фактическое экспортированное имя. Используйте extern «C» для подавления искажения имени.

Кроме того, вы должны объявить эту функцию __stdcall, как сказано в вашей декларации Delphi По умолчанию используется __cdecl. Это не удастся, когда вы начнете передавать аргументы.

1 голос
/ 19 июня 2010

__ declspec (dllexport) int sumT (int sumThah ) {
return sumTah ;

выглядит как опечатка или ваша ошибка ....

1 голос
/ 19 июня 2010

Если вы компилируете с помощью компилятора C ++, имя функции искажается так, что оно содержит данные об аргументах.Решение состоит в том, чтобы сделать что-то вроде:

extern "C" __declspec(dllexport) int myfn();

и затем ссылаться на него как _myfn.extern "C" говорит компилятору не искажать имя функции.Это не работает с шаблонными функциями, классами или перегруженными функциями.

...