Во-первых, Вам необходимо объявить все экспортируемые в Delphi DLL функции с
ключевыми словами export; stdcall;
Во-вторых, файл заголовка VC++ должен объявить все функции как тип
__declspec(dllexport) __stdcall (применяйте двойное подчеркивание в секции
объявления прототипа функции extern "C" { ... }. (вместо этого можно также
использовать __declspec(dllimport)...). Для примера:
extern "C" {
int __declspec(dllexport) __stdcall plusone(int); }
В-третьих, в VC++ компилятор настраивается на "украшающее" имена функций
__stcall, так что Ваша Delphi DLL соответственно должна экспортировать эти
функции. Для этого необходимо модифицировать файл Delphi 2.0 .DPR для Вашего
DLL, модифицируя имена всех функций, прописанных в разделе экспорта. Для
примера, если Вы экспортируете функцию function plusone (intval : Integer), Вам
необходимо включить следующую строку в раздел экспорта .DPR-файла:
plusone name "plusone@4"
Число, следующее за символом @, является общей длиной в байтах всех
функциональных аргументов. Самый простой путь для обнаружения неправильных
значений - попытаться слинковать Вашу VC++ программу и посмотреть на наличие
возможной ошибки компоновщика "unresolved external".
И, наконец, Вы можете легко создать библиотеку импорта, используя утилиту LIB
из поставки VC++. Для этого необходимо вручную (!!) создать .DEF-файл для Вашей
DLL с секцией экспорта, перечисляющей имена и/или порядковые номера всех
экспортируемых DLL функций. Формат .DEF-файла очень прост:
Затем запускаете LIB из командной строки DOS/Win95, и в качестве параметра
подставляете имя .DEF-файла. Например, LIB /DEF:MYDLL.DEF. Наконец, через диалог
Build|Settings|Linker Вы информируете VC++ о полученном .LIB-файле.
Вот пример кода:
*******MYDLLMU.PAS
unit MyDLLMU;
interfacefunction plusone(val : Integer) : Integer; export; stdcall;
procedure ChangeString(AString : PChar); export; stdcall;
implementationuses
Dialogs,
SysUtils;
function plusone(val : Integer) : Integer;
begin
Result := val + 1;
end;
procedure ChangeString(AString : PChar);
beginif AString = "Здравствуй" then
StrPCopy(AString, "Мир");
end;
end.
***********MYDLL.DPR
library mydll;
{ Существенное замечание об управлении памятью в DLL: Если DLL экспортирует функции со
строковыми параметрами или возвращающие строковые значения, модуль ShareMem надо
указывать в разделе Uses библиотеки и проекта первым. Это касается любых строк,
передаваемых как в DLL, так и из нее, даже если они размещаются внутри записей или
объектов. Модуль ShareMem служит интерфейсом менеджера разделяемой памяти
DELPHIMM.DLL, который должен разворачиваться одновременно с данной DLL. Чтобы избежать
применения DELPHIMM.DLL, строковую информацию можно передавать с помощью параметров
типа PChar или ShortString. }uses
SysUtils,
Classes,
MyDLLMU in "MyDLLMU.pas";
exports
plusone name "plusone@4",
ChangeString name "ChangeString@4";
beginend.
*************** MYDLL.DEF ;
----------------------------------------------------------------- ; Имя
файла: MYDLL.DEF ;
-----------------------------------------------------------------
Если Вас заинтересовала или понравилась информация по разработке на Delph - "Вызов Delphi DLL из MS Visual C++", Вы можете поставить закладку в социальной сети или в своём блоге на данную страницу: Так же Вы можете задать вопрос по работе этого модуля или примера через форму обратной связи, в сообщение обязательно указывайте название или ссылку на статью!