Здравствуйте, 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" писать, а вот что не помню.
Здравствуйте, _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
Здравствуйте, 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
Здравствуйте, _const_, Вы писали:
S>>Так было написано в спецификации к вызывающей программе S>>Т.к. в синтаксисе Паскаля я не силен, приходится верить. S>>В VC по-умолчанию как раз используется cdecl, а как в Delphi?
__>В Дельфи, по-моему, так __>
__>TDLLFunc = function (inParam:PChar;outParam:PChar;outSize:integer): Integer; cdecl;
__>
Тогда в чем может быть причина, есть идеи?
Re[2]: Проблема с созданием Dll на VC++ для вызова из Delphi
Здравствуйте, 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
Здравствуйте, 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
Похоже, в документации для вызывающе программы ошибка. Получается, что способ передачи параметров
экспортируемой функции должен быть родным паскалевским (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
Здравствуйте, Seeker, Вы писали:
S>Здравствуйте, _const_
S>Похоже, в документации для вызывающе программы ошибка. Получается, что способ передачи параметров S>экспортируемой функции должен быть родным паскалевским (register, кажется), когда параметры передаются S>через регистры слева направо
__stdcall
По-моему, не только в этом дело, а еще и в том, кто очищает стек. Но это уже совсем другая песня.
S>Тогда вместо S>
S>Вопрос: возможно ли на С задать паскалевский способ?
__>>Вообще же Микрософт говорит, что экспортируемые ф-ции должны быть по __stdcall. S>Согласен. Проблема в том, что есть только бинарник вызывающей программы, поэтому S>приходится подстраиваться под нее.
А исходников нет?
Тогда, полагаясь на стандарт, пишем так:
extern"C"int __stdcall DLLFunc(char inParam, char outParam, int outSize);
Далее создаем DEF файл, в котором прописываем
EXPORTS
DLLFunc
Вроде, все.
Re[8]: Проблема с созданием Dll на VC++ для вызова из Delphi
Здравствуйте, _const_, Вы писали:
S>>Похоже, в документации для вызывающе программы ошибка. Получается, что способ передачи параметров S>>экспортируемой функции должен быть родным паскалевским (register, кажется), когда параметры передаются S>>через регистры слева направо
__>__stdcall __>По-моему, не только в этом дело, а еще и в том, кто очищает стек. Но это уже совсем другая песня.
S>>Тогда вместо S>>
S>>Вопрос: возможно ли на С задать паскалевский способ?
__>>>Вообще же Микрософт говорит, что экспортируемые ф-ции должны быть по __stdcall. S>>Согласен. Проблема в том, что есть только бинарник вызывающей программы, поэтому S>>приходится подстраиваться под нее.
__>А исходников нет?
Нет, в этом вся загвоздка
__>Тогда, полагаясь на стандарт, пишем так: __>
__>extern"C"int __stdcall DLLFunc(char inParam, char outParam, int outSize);
__>
__>Далее создаем DEF файл, в котором прописываем __>EXPORTS __> DLLFunc
__>Вроде, все.
Так уже пробовал, не подходит.
Наверное, придется писать обертку на паскале...
В любом случае спасибо за советы