Проблема с созданием Dll на VC++ для вызова из Delphi
От: Seeker  
Дата: 16.06.05 05:02
Оценка:
Всем привет.

Есть прототип экспортируемой функции на Паскале (способ передачи cdecl):
TDLLFunc = function (inParam:PChar;outParam:PChar;outSize:integer): Integer;


Не получается на VC++ создать аналогичную. Пробовал
extern "C" int function(char * inParam, char * outParam, int outSize)

плюс в .DEF файле прописывал function.

Подскажите pls в чем ошибка?

22.07.05 01:07: Перенесено модератором из 'MFC' в соответствии с пожеланием автора — SchweinDeBurg
Re: Проблема с созданием Dll на VC++ для вызова из Delphi
От: SkyKnight Швейцария https://github.com/dmitrigrigoriev/
Дата: 16.06.05 07:08
Оценка:
Здравствуйте, Seeker, Вы писали:

S>Всем привет.


S>Есть прототип экспортируемой функции на Паскале (способ передачи cdecl):

S>
S>TDLLFunc = function (inParam:PChar;outParam:PChar;outSize:integer): Integer; 
S>


S>Не получается на VC++ создать аналогичную. Пробовал

S>
S>extern "C" int function(char * inParam, char * outParam, int outSize)
S>

S>плюс в .DEF файле прописывал function.

S>Подскажите pls в чем ошибка?

У меня была когда-то таже проблема. Единственное что сейчас помгю, так это то, что надо не extern "C" писать, а вот что не помню.
github.com/dmitrigrigoriev/
Re: Проблема с созданием Dll на VC++ для вызова из Delphi
От: _const_  
Дата: 16.06.05 07:33
Оценка:
Здравствуйте, Seeker, Вы писали:

S>Всем привет.


S>Есть прототип экспортируемой функции на Паскале (способ передачи cdecl):

S>
S>TDLLFunc = function (inParam:PChar;outParam:PChar;outSize:integer): Integer; 
S>


А с чего вы взяли, что здесь "способ передачи cdecl"?

S>Не получается на VC++ создать аналогичную. Пробовал

S>
S>extern "C" int function(char * inParam, char * outParam, int outSize)
S>

S>плюс в .DEF файле прописывал function.

S>Подскажите pls в чем ошибка?
Re[2]: Проблема с созданием Dll на VC++ для вызова из Delphi
От: Seeker  
Дата: 16.06.05 10:59
Оценка:
Здравствуйте, _const_, Вы писали:

__>Здравствуйте, Seeker, Вы писали:


S>>Есть прототип экспортируемой функции на Паскале (способ передачи cdecl):

S>>
S>>TDLLFunc = function (inParam:PChar;outParam:PChar;outSize:integer): Integer; 
S>>


__>А с чего вы взяли, что здесь "способ передачи cdecl"?


Так было написано в спецификации к вызывающей программе
Т.к. в синтаксисе Паскаля я не силен, приходится верить.
В VC по-умолчанию как раз используется cdecl, а как в Delphi?
Re[3]: Проблема с созданием Dll на VC++ для вызова из Delphi
От: _const_  
Дата: 16.06.05 11:40
Оценка:
Здравствуйте, Seeker, Вы писали:

S>Здравствуйте, _const_, Вы писали:


__>>Здравствуйте, Seeker, Вы писали:


S>>>Есть прототип экспортируемой функции на Паскале (способ передачи cdecl):

S>>>
S>>>TDLLFunc = function (inParam:PChar;outParam:PChar;outSize:integer): Integer; 
S>>>


__>>А с чего вы взяли, что здесь "способ передачи cdecl"?


S>Так было написано в спецификации к вызывающей программе

S>Т.к. в синтаксисе Паскаля я не силен, приходится верить.
S>В VC по-умолчанию как раз используется cdecl, а как в Delphi?

В Дельфи, по-моему, так
TDLLFunc = function (inParam:PChar;outParam:PChar;outSize:integer): Integer; cdecl;
Re[4]: Проблема с созданием Dll на VC++ для вызова из Delphi
От: Seeker  
Дата: 16.06.05 11:44
Оценка:
Здравствуйте, _const_, Вы писали:

S>>Так было написано в спецификации к вызывающей программе

S>>Т.к. в синтаксисе Паскаля я не силен, приходится верить.
S>>В VC по-умолчанию как раз используется cdecl, а как в Delphi?

__>В Дельфи, по-моему, так

__>
__>TDLLFunc = function (inParam:PChar;outParam:PChar;outSize:integer): Integer; cdecl;
__>


Тогда в чем может быть причина, есть идеи?
Re[2]: Проблема с созданием Dll на VC++ для вызова из Delphi
От: Seeker  
Дата: 16.06.05 13:18
Оценка:
Здравствуйте, SkyKnight, Вы писали:

S>>Есть прототип экспортируемой функции на Паскале (способ передачи cdecl):

S>>
S>>TDLLFunc = function (inParam:PChar;outParam:PChar;outSize:integer): Integer; 
S>>


S>>Не получается на VC++ создать аналогичную. Пробовал

S>>
S>>extern "C" int function(char * inParam, char * outParam, int outSize)
S>>

S>>плюс в .DEF файле прописывал function.

S>>Подскажите pls в чем ошибка?

SK>У меня была когда-то таже проблема. Единственное что сейчас помгю, так это то, что надо не extern "C" писать, а вот что не помню.

А пример можно? А то, что-то совсем глухо
Re: Проблема с созданием Dll на VC++ для вызова из Delphi
От: Imbecile Россия  
Дата: 16.06.05 13:33
Оценка:
Здравствуйте, Seeker, Вы писали:

Щас немного пьян, но точно помню, что stdcall;!!!
Re[5]: Проблема с созданием Dll на VC++ для вызова из Delphi
От: _const_  
Дата: 17.06.05 07:22
Оценка:
Здравствуйте, Seeker, Вы писали:

S>Здравствуйте, _const_, Вы писали:


S>>>Так было написано в спецификации к вызывающей программе

S>>>Т.к. в синтаксисе Паскаля я не силен, приходится верить.
S>>>В VC по-умолчанию как раз используется cdecl, а как в Delphi?

__>>В Дельфи, по-моему, так

__>>
__>>TDLLFunc = function (inParam:PChar;outParam:PChar;outSize:integer): Integer; cdecl;
__>>


S>Тогда в чем может быть причина, есть идеи?


У меня работает так.
В Дельфи
var
 DLLFunc: function (inParam:PChar;outParam:PChar;outSize:integer): Integer; cdecl;

...
 @DLLFunc := GetProcAddress(...);


Обращаем особое внимание на cdecl в конце.

В VC
extern "C" __declspec(dllexport) int DLLFunc(char inParam, char outParam, int outSize);


И никаких DEF файлов. При этом в компиляторе указано по умолчанию cdecl (хотя этот параметр настраиваемый). Иначе изменяем на
extern "C" __declspec(dllexport) int __cdecl DLLFunc(char inParam, char outParam, int outSize);


Вообще же Микрософт говорит, что экспортируемые ф-ции должны быть по __stdcall.
Re[6]: Проблема с созданием Dll на VC++ для вызова из Delphi
От: Seeker  
Дата: 17.06.05 09:12
Оценка:
Здравствуйте, _const_

Похоже, в документации для вызывающе программы ошибка. Получается, что способ передачи параметров
экспортируемой функции должен быть родным паскалевским (register, кажется), когда параметры передаются
через регистры слева направо

Тогда вместо
function (inParam:PChar;outParam:PChar;outSize:integer): Integer; cdecl;
должно быть
function (inParam:PChar;outParam:PChar;outSize:integer): Integer // cdecl отсутствует


Вопрос: возможно ли на С задать паскалевский способ?

__>Вообще же Микрософт говорит, что экспортируемые ф-ции должны быть по __stdcall.

Согласен. Проблема в том, что есть только бинарник вызывающей программы, поэтому
приходится подстраиваться под нее.
Re[7]: Проблема с созданием Dll на VC++ для вызова из Delphi
От: _const_  
Дата: 17.06.05 09:59
Оценка:
Здравствуйте, Seeker, Вы писали:

S>Здравствуйте, _const_


S>Похоже, в документации для вызывающе программы ошибка. Получается, что способ передачи параметров

S>экспортируемой функции должен быть родным паскалевским (register, кажется), когда параметры передаются
S>через регистры слева направо

__stdcall
По-моему, не только в этом дело, а еще и в том, кто очищает стек. Но это уже совсем другая песня.

S>Тогда вместо

S>
S>function (inParam:PChar;outParam:PChar;outSize:integer): Integer; cdecl;
S>должно быть
S>function (inParam:PChar;outParam:PChar;outSize:integer): Integer // cdecl отсутствует
S>


S>Вопрос: возможно ли на С задать паскалевский способ?


__>>Вообще же Микрософт говорит, что экспортируемые ф-ции должны быть по __stdcall.

S>Согласен. Проблема в том, что есть только бинарник вызывающей программы, поэтому
S>приходится подстраиваться под нее.

А исходников нет?

Тогда, полагаясь на стандарт, пишем так:
extern "C" int __stdcall DLLFunc(char inParam, char outParam, int outSize);


Далее создаем DEF файл, в котором прописываем
EXPORTS
DLLFunc

Вроде, все.
Re[8]: Проблема с созданием Dll на VC++ для вызова из Delphi
От: Seeker  
Дата: 17.06.05 11:02
Оценка:
Здравствуйте, _const_, Вы писали:

S>>Похоже, в документации для вызывающе программы ошибка. Получается, что способ передачи параметров

S>>экспортируемой функции должен быть родным паскалевским (register, кажется), когда параметры передаются
S>>через регистры слева направо

__>__stdcall

__>По-моему, не только в этом дело, а еще и в том, кто очищает стек. Но это уже совсем другая песня.

S>>Тогда вместо

S>>
S>>function (inParam:PChar;outParam:PChar;outSize:integer): Integer; cdecl;
S>>должно быть
S>>function (inParam:PChar;outParam:PChar;outSize:integer): Integer // cdecl отсутствует
S>>


S>>Вопрос: возможно ли на С задать паскалевский способ?


__>>>Вообще же Микрософт говорит, что экспортируемые ф-ции должны быть по __stdcall.

S>>Согласен. Проблема в том, что есть только бинарник вызывающей программы, поэтому
S>>приходится подстраиваться под нее.

__>А исходников нет?

Нет, в этом вся загвоздка

__>Тогда, полагаясь на стандарт, пишем так:

__>
__>extern "C" int __stdcall DLLFunc(char inParam, char outParam, int outSize);
__>


__>Далее создаем DEF файл, в котором прописываем

__>EXPORTS
__> DLLFunc

__>Вроде, все.

Так уже пробовал, не подходит.

Наверное, придется писать обертку на паскале...
В любом случае спасибо за советы
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.