Re[18]: Как импортировать функцию stdcall
От: MShura  
Дата: 11.07.06 15:25
Оценка: +1
<Доказательства загрузки dll загрузчиком PE пропущены>

MS>>Насколько я понял автора топика он пытался использовать dll скомпиленную не по правилам MS, как если бы она была таковой.

MS>>Естественно получил проблему.
MS>>То что Дельфи знает формат MS ( иначе она не смогла бы компилиться с kernel32.lib ) это конечно хорошо, но должна ли MS знать формат Дельфи?


FDS>Не. Не так. Delphi не знает формат MS! Delphi знает как только генерировать PE-файл.

FDS>В секции импорта PE-файла пишется название dll и имя импортируемой функции и всё. Остальное делает загрузчик Windows.
FDS>То есть Delphi никаких lib-файлов не требуется. Я могу импортировать функцию из любой dll, если знаю её имя или индекс, название dll и соглашение о вызове (и сигнатуру). То есть, если я хочу импортировать функцию EX из exdpr.dll, но при этом она скомпилирована MS VC с модификаторами extern "C" и __stdcall то мне нужно написать строку
FDS>
FDS>function EX(var Data: integer): integer; stdcall; external 'exdpr.dll' name '_EX@4';
FDS>

FDS>и больше ничего не надо, кроме файла exdpr.dll во время исполнения в надлежащей директории.

Неужели все функции из SDK\include нужно явно описывать таким образом?

FDS>MS должна позволять импортировать функции независимо от того, кто скомпилировал dll — Delphi это позволяет. Странно что MS — нет. Я был очень удивлён, но сам ничего в справке не нашёл по этому поводу.


Это напоминает разницу между C и C++.

Явно загружая библиотеку мы делаем явный каст с надеждой что ничего в экспортируемой функции не поменялось (см выделенное).
Неужели не было ошибок с предполагаемым и реальным типом функций?
Использование библиотеки импорта повышает надежность обеспечивая дополнительную провеку на этапе линковки.

P.S.
Согласен, что было бы неплохо иметь возможность перенести ответственность с линкера на пользователя так, как это реализовано в Дельфи.
Хотя как например импортировать функции подверженные C++ искажению имен или более того импортировать классы?
В этом случае лучше библиотеки импорта трудно придумать.
Re[19]: Как импортировать функцию stdcall
От: FDSC Россия consp11.github.io блог
Дата: 11.07.06 15:34
Оценка:
Здравствуйте, MShura, Вы писали:

FDS>>То есть Delphi никаких lib-файлов не требуется. Я могу импортировать функцию из любой dll, если знаю её имя или индекс, название dll и соглашение о вызове (и сигнатуру). То есть, если я хочу импортировать функцию EX из exdpr.dll, но при этом она скомпилирована MS VC с модификаторами extern "C" и __stdcall то мне нужно написать строку

FDS>>
FDS>>function EX(var Data: integer): integer; stdcall; external 'exdpr.dll' name '_EX@4';
FDS>>

FDS>>и больше ничего не надо, кроме файла exdpr.dll во время исполнения в надлежащей директории.

MS>Неужели все функции из SDK\include нужно явно описывать таким образом?


Да, они так и описаны в подключаемых файлах библиотек.

FDS>>MS должна позволять импортировать функции независимо от того, кто скомпилировал dll — Delphi это позволяет. Странно что MS — нет. Я был очень удивлён, но сам ничего в справке не нашёл по этому поводу.


MS>Это напоминает разницу между C и C++.


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

MS>Неужели не было ошибок с предполагаемым и реальным типом функций?
MS>Использование библиотеки импорта повышает надежность обеспечивая дополнительную провеку на этапе линковки.

Конечно, случаются. Но ведь и lib можно взять не той версии. Это было бы хорошо, если бы lib-ы были у всех одинаковыми

MS>P.S.

MS>Согласен, что было бы неплохо иметь возможность перенести ответственность с линкера на пользователя так, как это реализовано в Дельфи.
MS>Хотя как например импортировать функции подверженные C++ искажению имен или более того импортировать классы?
MS>В этом случае лучше библиотеки импорта трудно придумать.

М-да. Хотя я классы никогда не импортировал , тогда уж сразу COM надо использовать.
Re[4]: Спасибо, я буду исп. динамический импорт
От: Ракопаукодав  
Дата: 11.07.06 15:46
Оценка:
Здравствуйте, FDSC, Вы писали:

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


FDS>Если это не годится, можно после компиляции в exe искать строки типа _EX@4 и прямо в файле заменять их на EX\x0\x0\x0


Ну, это извращения. Лучше уж динамический импорт

Спасибо всем
Поль вдруг вскочил и с необыкновенной живостью изобразил ракопаука. Отвратительный скрежещущий вой многоногого чудовища, пробирающегося через джунгли страшной Пандоры, огласил окрестности. И, словно в ответ, издалека донёсся глубокий ревущий вздох.
Re[2]: Что мне нужно: уточнения
От: vvotan Россия  
Дата: 11.07.06 15:49
Оценка:
Здравствуйте, Ракопаукодав, Вы писали:

Р>Спасибо за отзывы, но руки у меня оказались слишком кривые:


Р>Я второпях забыл подключить lib-файл к проекту , так что задачка даже ещё хуже оказалась


Р>Есть только lib файл Delphi (не знаю какой именно версии, или 5-ой или 7-ой, скорее всего) и сама dll.


Борландовские и майкрософтовские lib — файлы несовместимы.
--
Sergey Chadov

... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[15]: Как импортировать функцию stdcall
От: CreatorCray  
Дата: 12.07.06 04:28
Оценка:
Здравствуйте, MShura, Вы писали:

FDS>>Да, а вот в Delphi — легко!


MS>Можно подробней?

MS>DLL загружается загрузчиком PE или все-же самим приложением?

MS>В VC можно воспользоваться таким вариантом "отложенной" загрузки

MS>http://www.rsdn.ru/article/cpp/delayload.xml
Автор(ы): Андрей Солодовников
Дата: 20.03.2005
В данной статье описывается способ реализации отложенной загрузки динамических библиотек на С++ без использования механизма delayload, приведена реализация библиотеки отложенной загрузки и пример ее использования.



Который под IC9.1 не компилируется....
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[19]: Как импортировать функцию stdcall
От: ekamaloff Великобритания  
Дата: 12.07.06 04:45
Оценка:
Здравствуйте, MShura, Вы писали:

MS>Неужели все функции из SDK\include нужно явно описывать таким образом?


Ничего подобного. Если речь идет о функциях WinAPI, то они экспортируются из dll по недекорированному имени и следовательно импортируются в delphi по нему же. Вот вырезка из Windows.pas:

function CreateDialogParamA; external user32 name 'CreateDialogParamA';
function CreateDialogParamW; external user32 name 'CreateDialogParamW';
function CreateDialogParam; external user32 name 'CreateDialogParamA';
function CreateIcon; external user32 name 'CreateIcon';
function CreateIconFromResource; external user32 name 'CreateIconFromResource';
function CreateIconFromResourceEx; external user32 name 'CreateIconFromResourceEx';
function CreateIconIndirect; external user32 name 'CreateIconIndirect';
function CreateMDIWindowA; external user32 name 'CreateMDIWindowA';
function CreateMDIWindowW; external user32 name 'CreateMDIWindowW';
function CreateMDIWindow; external user32 name 'CreateMDIWindowA';
function CreateMenu; external user32 name 'CreateMenu';
function CreatePopupMenu; external user32 name 'CreatePopupMenu';
function CreateWindowExA; external user32 name 'CreateWindowExA';
function CreateWindowExW; external user32 name 'CreateWindowExW';
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re[20]: Как импортировать функцию stdcall
От: MShura  
Дата: 12.07.06 10:15
Оценка:
MS>>Неужели все функции из SDK\include нужно явно описывать таким образом?

E>Ничего подобного. Если речь идет о функциях WinAPI, то они экспортируются из dll по недекорированному имени и следовательно импортируются в delphi по нему же. Вот вырезка из Windows.pas:


E>
E>function CreateDialogParamA; external user32 name 'CreateDialogParamA';
....
E>


Насколько я понял файл windows.h из Platform SDK не подключается?
Означает ли Windows.pas дублирует файл windows.h и все остальное?

Практикуется ли использование макросов (например CreateDialogParam) в Дельфи?
Кто этот макрос определяет (если не включается файл windows.h)

Я не знаю с какой частотой обновляется Дельфи, но Platform SDK регулярно обновляется.
К счастью старые функции не меняются, а новые функции добавляются постоянно.
Значит ли это что нужно самому править файл Windows.pas?
Re[21]: Как импортировать функцию stdcall
От: FDSC Россия consp11.github.io блог
Дата: 12.07.06 10:20
Оценка:
Здравствуйте, MShura, Вы писали:


MS>>>Неужели все функции из SDK\include нужно явно описывать таким образом?


E>>Ничего подобного. Если речь идет о функциях WinAPI, то они экспортируются из dll по недекорированному имени и следовательно импортируются в delphi по нему же. Вот вырезка из Windows.pas:


E>>
E>>function CreateDialogParamA; external user32 name 'CreateDialogParamA';
MS>....
E>>


MS>Насколько я понял файл windows.h из Platform SDK не подключается?

MS>Означает ли Windows.pas дублирует файл windows.h и все остальное?

windows.pas и есть windows.h

MS>Практикуется ли использование макросов (например CreateDialogParam) в Дельфи?

MS>Кто этот макрос определяет (если не включается файл windows.h)

Они в любом случае будут функциями. Вы об этом:

function CreateDialogParam(hInstance: HINST; lpTemplateName: PChar;
  hWndParent: HWND; lpDialogFunc: TFNDlgProc; dwInitParam: LPARAM): HWND; stdcall;
?

MS>Я не знаю с какой частотой обновляется Дельфи, но Platform SDK регулярно обновляется.

MS>К счастью старые функции не меняются, а новые функции добавляются постоянно.
MS>Значит ли это что нужно самому править файл Windows.pas?

Это так же невозможно, как править windows.h
Re[20]: Как импортировать функцию stdcall
От: FDSC Россия consp11.github.io блог
Дата: 12.07.06 10:22
Оценка:
Здравствуйте, ekamaloff, Вы писали:

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


MS>>Неужели все функции из SDK\include нужно явно описывать таким образом?


E>Ничего подобного. Если речь идет о функциях WinAPI, то они экспортируются из dll по недекорированному имени и следовательно импортируются в delphi по нему же. Вот вырезка из Windows.pas:


Спасибо за уточнение, это и имелось ввиду
Re[22]: Как импортировать функцию stdcall
От: FDSC Россия consp11.github.io блог
Дата: 12.07.06 10:25
Оценка: :)
Здравствуйте, FDSC, Вы писали:

MS>>Я не знаю с какой частотой обновляется Дельфи, но Platform SDK регулярно обновляется.

MS>>К счастью старые функции не меняются, а новые функции добавляются постоянно.
MS>>Значит ли это что нужно самому править файл Windows.pas?

FDS>Это так же невозможно, как править windows.h


В Delphi определены не все функции и константы SDK. То, чего нет в стандартных модулях можно объявить самостоятельно в своих файлах. Иногда даже приходится переопределять функции, уже определённые в стандартных модулях (очень редко)
Re[21]: Как импортировать функцию stdcall
От: ekamaloff Великобритания  
Дата: 12.07.06 10:25
Оценка:
Здравствуйте, MShura, Вы писали:

MS>Насколько я понял файл windows.h из Platform SDK не подключается?

MS>Означает ли Windows.pas дублирует файл windows.h и все остальное?

Хидеры вообще в дельфи не подключаются. Windows.pas это и есть windows.h

MS>Практикуется ли использование макросов (например CreateDialogParam) в Дельфи?

MS>Кто этот макрос определяет (если не включается файл windows.h)

Вместо макросов пишутся функции , например такие:

function CreateWindow(lpClassName: PChar; lpWindowName: PChar;
  dwStyle: DWORD; X, Y, nWidth, nHeight: Integer; hWndParent: HWND;
  hMenu: HMENU; hInstance: HINST; lpParam: Pointer): HWND;
begin
  Result := CreateWindowEx(0, lpClassName, lpWindowName, dwStyle, X, Y,
    nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam);
end;


MS>Я не знаю с какой частотой обновляется Дельфи, но Platform SDK регулярно обновляется.

MS>К счастью старые функции не меняются, а новые функции добавляются постоянно.
MS>Значит ли это что нужно самому править файл Windows.pas?

Если какой-то функции нет, обычно делают свой модуль (типа WindowsEx.pas) и в него пихают все недостающие объявления. Стандартные модули изменять нельзя
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re[22]: Как импортировать функцию stdcall
От: MShura  
Дата: 12.07.06 11:42
Оценка:
MS>>Практикуется ли использование макросов (например CreateDialogParam) в Дельфи?
MS>>Кто этот макрос определяет (если не включается файл windows.h)

E>Вместо макросов пишутся функции , например такие:


E>
E>function CreateWindow(lpClassName: PChar; lpWindowName: PChar;
E>  dwStyle: DWORD; X, Y, nWidth, nHeight: Integer; hWndParent: HWND;
E>  hMenu: HMENU; hInstance: HINST; lpParam: Pointer): HWND;
E>begin
E>  Result := CreateWindowEx(0, lpClassName, lpWindowName, dwStyle, X, Y,
E>    nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam);
E>end;
E>


В Platform SDK CreateWindow и CreateWindowEx — суть макросы, определенные в winuser.h (включается из windows.h)
Судя по всему в Дельфи это уже не макросы?
Именно это я и хотел узнать.

Если это не макросы, то можно ли писать программы с использованием TCHAR?
Re[16]: Как импортировать функцию stdcall
От: Andrew S Россия http://alchemy-lab.com
Дата: 12.07.06 11:53
Оценка:
FDS>>>Да, а вот в Delphi — легко!

MS>>Можно подробней?

MS>>DLL загружается загрузчиком PE или все-же самим приложением?

MS>>В VC можно воспользоваться таким вариантом "отложенной" загрузки

MS>>http://www.rsdn.ru/article/cpp/delayload.xml
Автор(ы): Андрей Солодовников
Дата: 20.03.2005
В данной статье описывается способ реализации отложенной загрузки динамических библиотек на С++ без использования механизма delayload, приведена реализация библиотеки отложенной загрузки и пример ее использования.



CC>Который под IC9.1 не компилируется....


Ну так опишите проблему в соответствующем
Автор: Andrew S
Дата: 05.08.04
топике, наверняка автору будет интересно поправить
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[23]: Как импортировать функцию stdcall
От: FDSC Россия consp11.github.io блог
Дата: 12.07.06 11:58
Оценка: -1
Здравствуйте, MShura, Вы писали:

MS>>>Практикуется ли использование макросов (например CreateDialogParam) в Дельфи?

MS>>>Кто этот макрос определяет (если не включается файл windows.h)

E>>Вместо макросов пишутся функции , например такие:


E>>
E>>function CreateWindow(lpClassName: PChar; lpWindowName: PChar;
E>>  dwStyle: DWORD; X, Y, nWidth, nHeight: Integer; hWndParent: HWND;
E>>  hMenu: HMENU; hInstance: HINST; lpParam: Pointer): HWND;
E>>begin
E>>  Result := CreateWindowEx(0, lpClassName, lpWindowName, dwStyle, X, Y,
E>>    nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam);
E>>end;
E>>


MS>В Platform SDK CreateWindow и CreateWindowEx — суть макросы, определенные в winuser.h (включается из windows.h)

MS>Судя по всему в Дельфи это уже не макросы?
MS>Именно это я и хотел узнать.

MS>Если это не макросы, то можно ли писать программы с использованием TCHAR?



Естественно нельзя. Нужно писать программы с использованием WideChar (WideString), если вы любите Unicode и char в противном случае

Соотв. вызывать CreateFileW, например.
Re[23]: Как импортировать функцию stdcall
От: ekamaloff Великобритания  
Дата: 12.07.06 11:59
Оценка:
Здравствуйте, MShura, Вы писали:

MS>В Platform SDK CreateWindow и CreateWindowEx — суть макросы, определенные в winuser.h (включается из windows.h)


Я знаю, поэтому и привел пример

MS>Судя по всему в Дельфи это уже не макросы?


Да, в дельфи это уже функции.

MS>Если это не макросы, то можно ли писать программы с использованием TCHAR?


теоретически да. Потому что это можно разрулить с помощью директив условной компиляции, а не макросов:

type
{$IFDEF UNICODE}
    TCHAR = AnsiChar;
{$ELSE}
    TCHAR = WideChar;
{$ENDIF}


Макросы в дельфи есть, но они очень убогие по сравнению с c++. Вот все что можно сделать:

{$DEFINE UNICODE}


Речи о подобии выражений в макросах даже нет.

Практически никто так не делает, поскольку дельфи, точнее ее основная библиотека — VCL, сильно заточены под AnsiChar.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re[24]: Как импортировать функцию stdcall
От: FDSC Россия consp11.github.io блог
Дата: 12.07.06 12:00
Оценка:
Здравствуйте, ekamaloff, Вы писали:



E>Практически никто так не делает, поскольку дельфи, точнее ее основная библиотека — VCL, сильно заточены под AnsiChar.


Я так делаю
Re[17]: Как импортировать функцию stdcall
От: CreatorCray  
Дата: 12.07.06 12:09
Оценка:
Здравствуйте, Andrew S, Вы писали:

CC>>Который под IC9.1 не компилируется....

AS>Ну так опишите проблему в соответствующем
Автор: Andrew S
Дата: 05.08.04
топике, наверняка автору будет интересно поправить

Уже до меня писали. Автор ответил что поправить нет возможности по причине наличия отсутствия у него вышеуказанного компилятора.
Кроме того, с подрузкой через LoadLibrary я и сам могу. Тем более там всего то одна функция. Трабл в том, что надо это в LIB-проекте который отдается в виде "связка один .lib файл + n .h файлов" отдается на юзание во втором проекте. И хотелось бы как нить извратнуться чтоб в эту либу присоединить ссылку на эту функцию для того чтоб к получившемуся во втором проекте EXEшнику все нужное прилинковалось статически.
Может быть есть еще и вариант с постбилд обработкой lib-ы путем какого нить merge с фейковой либой для нужной DLL, но пока что то у меня на эту тему не получается ничего
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[18]: Как импортировать функцию stdcall
От: Andrew S Россия http://alchemy-lab.com
Дата: 12.07.06 12:19
Оценка:
CC>>>Который под IC9.1 не компилируется....
AS>>Ну так опишите проблему в соответствующем
Автор: Andrew S
Дата: 05.08.04
топике, наверняка автору будет интересно поправить

CC>Уже до меня писали. Автор ответил что поправить нет возможности по причине наличия отсутствия у него вышеуказанного компилятора.

Ну так и ICL7 нет. Однако adontz не поленился откомпилить и проанализировать проблемы. В результате все заработало.
Кстати, возможно, новые версии будут на 9-ке вполне работать — большинство несовместимости из-за макросов, а с некоторого времени там бустовские можно пользовать заместо нативных (DL_USE_BOOST_PP).
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[19]: Как импортировать функцию stdcall
От: CreatorCray  
Дата: 12.07.06 12:50
Оценка:
Здравствуйте, Andrew S, Вы писали:

CC>>>>Который под IC9.1 не компилируется....

AS>>>Ну так опишите проблему в соответствующем
Автор: Andrew S
Дата: 05.08.04
топике, наверняка автору будет интересно поправить

CC>>Уже до меня писали. Автор ответил что поправить нет возможности по причине наличия отсутствия у него вышеуказанного компилятора.

AS>Ну так и ICL7 нет. Однако adontz не поленился откомпилить и проанализировать проблемы. В результате все заработало.

AS>Кстати, возможно, новые версии будут на 9-ке вполне работать — большинство несовместимости из-за макросов, а с некоторого времени там бустовские можно пользовать заместо нативных (DL_USE_BOOST_PP).

Да уже и надобность отпала — только что все заработало как мне надо было. Решение: создание фейковой DLL с либой и вписывание имени либы в строку линкера. Почему раньше это же глючило — хез.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[19]: Как импортировать функцию stdcall
От: CreatorCray  
Дата: 12.07.06 12:50
Оценка:
Здравствуйте, Andrew S, Вы писали:

AS>Ну так и ICL7 нет. Однако adontz не поленился откомпилить и проанализировать проблемы. В результате все заработало.

Сорри, но свободного времени нету пока...

AS>Кстати, возможно, новые версии будут на 9-ке вполне работать — большинство несовместимости из-за макросов

Качал и пробовал не далее как вчера днем.

AS>, а с некоторого времени там бустовские можно пользовать заместо нативных (DL_USE_BOOST_PP).

Это хорошо только в том случае, когда буст уже используется в проекте. Если же нет — то подрубать этого монстра для компиляции одного файла что то не хочется.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.