<Доказательства загрузки 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++ искажению имен или более того импортировать классы?
В этом случае лучше библиотеки импорта трудно придумать.
Здравствуйте, 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 надо использовать.
Здравствуйте, FDSC, Вы писали:
FDS>Здравствуйте, FDSC, Вы писали:
FDS>Если это не годится, можно после компиляции в exe искать строки типа _EX@4 и прямо в файле заменять их на EX\x0\x0\x0
Ну, это извращения. Лучше уж динамический импорт
Спасибо всем
Поль вдруг вскочил и с необыкновенной живостью изобразил ракопаука. Отвратительный скрежещущий вой многоногого чудовища, пробирающегося через джунгли страшной Пандоры, огласил окрестности. И, словно в ответ, издалека донёсся глубокий ревущий вздох.
Здравствуйте, Ракопаукодав, Вы писали:
Р>Спасибо за отзывы, но руки у меня оказались слишком кривые:
Р>Я второпях забыл подключить lib-файл к проекту , так что задачка даже ещё хуже оказалась
Р>Есть только lib файл Delphi (не знаю какой именно версии, или 5-ой или 7-ой, скорее всего) и сама dll.
Борландовские и майкрософтовские lib — файлы несовместимы.
Здравствуйте, MShura, Вы писали:
FDS>>Да, а вот в Delphi — легко!
MS>Можно подробней? MS>DLL загружается загрузчиком PE или все-же самим приложением?
MS>В VC можно воспользоваться таким вариантом "отложенной" загрузки MS>http://www.rsdn.ru/article/cpp/delayload.xml
Здравствуйте, 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
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?
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)
?
MS>Я не знаю с какой частотой обновляется Дельфи, но Platform SDK регулярно обновляется. MS>К счастью старые функции не меняются, а новые функции добавляются постоянно. MS>Значит ли это что нужно самому править файл Windows.pas?
Здравствуйте, ekamaloff, Вы писали:
E>Здравствуйте, MShura, Вы писали:
MS>>Неужели все функции из SDK\include нужно явно описывать таким образом?
E>Ничего подобного. Если речь идет о функциях WinAPI, то они экспортируются из dll по недекорированному имени и следовательно импортируются в delphi по нему же. Вот вырезка из Windows.pas:
Здравствуйте, FDSC, Вы писали:
MS>>Я не знаю с какой частотой обновляется Дельфи, но Platform SDK регулярно обновляется. MS>>К счастью старые функции не меняются, а новые функции добавляются постоянно. MS>>Значит ли это что нужно самому править файл Windows.pas?
FDS>Это так же невозможно, как править windows.h
В Delphi определены не все функции и константы SDK. То, чего нет в стандартных модулях можно объявить самостоятельно в своих файлах. Иногда даже приходится переопределять функции, уже определённые в стандартных модулях (очень редко)
Здравствуйте, 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
MS>>Практикуется ли использование макросов (например CreateDialogParam) в Дельфи? MS>>Кто этот макрос определяет (если не включается файл windows.h)
E>Вместо макросов пишутся функции , например такие:
E>
В Platform SDK CreateWindow и CreateWindowEx — суть макросы, определенные в winuser.h (включается из windows.h)
Судя по всему в Дельфи это уже не макросы?
Именно это я и хотел узнать.
Если это не макросы, то можно ли писать программы с использованием TCHAR?
FDS>>>Да, а вот в Delphi — легко!
MS>>Можно подробней? MS>>DLL загружается загрузчиком PE или все-же самим приложением?
MS>>В VC можно воспользоваться таким вариантом "отложенной" загрузки MS>>http://www.rsdn.ru/article/cpp/delayload.xml
Здравствуйте, MShura, Вы писали:
MS>>>Практикуется ли использование макросов (например CreateDialogParam) в Дельфи? MS>>>Кто этот макрос определяет (если не включается файл windows.h)
E>>Вместо макросов пишутся функции , например такие:
E>>
MS>В Platform SDK CreateWindow и CreateWindowEx — суть макросы, определенные в winuser.h (включается из windows.h) MS>Судя по всему в Дельфи это уже не макросы? MS>Именно это я и хотел узнать.
MS>Если это не макросы, то можно ли писать программы с использованием TCHAR?
Естественно нельзя. Нужно писать программы с использованием WideChar (WideString), если вы любите Unicode и char в противном случае
топике, наверняка автору будет интересно поправить
Уже до меня писали. Автор ответил что поправить нет возможности по причине наличия отсутствия у него вышеуказанного компилятора.
Кроме того, с подрузкой через LoadLibrary я и сам могу. Тем более там всего то одна функция. Трабл в том, что надо это в LIB-проекте который отдается в виде "связка один .lib файл + n .h файлов" отдается на юзание во втором проекте. И хотелось бы как нить извратнуться чтоб в эту либу присоединить ссылку на эту функцию для того чтоб к получившемуся во втором проекте EXEшнику все нужное прилинковалось статически.
Может быть есть еще и вариант с постбилд обработкой lib-ы путем какого нить merge с фейковой либой для нужной DLL, но пока что то у меня на эту тему не получается ничего
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
топике, наверняка автору будет интересно поправить CC>Уже до меня писали. Автор ответил что поправить нет возможности по причине наличия отсутствия у него вышеуказанного компилятора.
Ну так и ICL7 нет. Однако adontz не поленился откомпилить и проанализировать проблемы. В результате все заработало.
Кстати, возможно, новые версии будут на 9-ке вполне работать — большинство несовместимости из-за макросов, а с некоторого времени там бустовские можно пользовать заместо нативных (DL_USE_BOOST_PP).
топике, наверняка автору будет интересно поправить CC>>Уже до меня писали. Автор ответил что поправить нет возможности по причине наличия отсутствия у него вышеуказанного компилятора.
AS>Ну так и ICL7 нет. Однако adontz не поленился откомпилить и проанализировать проблемы. В результате все заработало. AS>Кстати, возможно, новые версии будут на 9-ке вполне работать — большинство несовместимости из-за макросов, а с некоторого времени там бустовские можно пользовать заместо нативных (DL_USE_BOOST_PP).
Да уже и надобность отпала — только что все заработало как мне надо было. Решение: создание фейковой DLL с либой и вписывание имени либы в строку линкера. Почему раньше это же глючило — хез.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, Andrew S, Вы писали:
AS>Ну так и ICL7 нет. Однако adontz не поленился откомпилить и проанализировать проблемы. В результате все заработало.
Сорри, но свободного времени нету пока...
AS>Кстати, возможно, новые версии будут на 9-ке вполне работать — большинство несовместимости из-за макросов
Качал и пробовал не далее как вчера днем.
AS>, а с некоторого времени там бустовские можно пользовать заместо нативных (DL_USE_BOOST_PP).
Это хорошо только в том случае, когда буст уже используется в проекте. Если же нет — то подрубать этого монстра для компиляции одного файла что то не хочется.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока