Як викликати функцію з dll (написаної на Delphi) з VC ++.
Погортавши інтернет :) код самої dll пишемо так:
procedure Init (); stdcall; export;
begin
end;
exports
Init name "Init @ 0"; // 0 - сумарний розмір усіх параметрів в байтах
end.
library TDLL
description "TDLL Library"
exports
Init @ 0
і включаємо його в проект VC.
extern "C"
<
_declspec (dllimport) _stdcall void Init ();
>
Компоновщик на це каже:
Взагалі можливо статичне зв'язування або ж тільки дінамічесокое?
Якщо вже робити бібліотеку для використання виключно з C / C ++, то зручно скористатися стандартними засобами VC, (якими ви і намагаєтеся користуватися). Для цього в паскалевская тексті потрібно вказати, що функції викликаються в угодах cdecl, а не stdcall. Я поправив ваш текст так:
library dccdll;
function Init (a, b: integer): integer; cdecl; export;
begin
Init: = a - b + 1;
end;
exports
Init;
end.
Припустимо, ви виготовили бібліотеку шляхом запуску
і отримали бібліотеку dccdll.dll. Що робити далі.
Нацьковуєте на неї борландовскую утиліту impdef:
impdef dccdll.def dccdll.dll
і отримуєте файл dccdll.def - У нашому випадку це буде
EXPORTS
Init @ 1; Init
Виконуєте bat-файл такого змісту:
call "C: \ Program Files \ Microsoft Visual Studio \ VC98 \ Bin \ VCVARS32.BAT"
lib /DEF:dccdll.def / MACHINE: ix86 /out:dccdll.lib
і отримуєте бібліотеку dccdll.lib
Пишете заголовки dccdll.h, в якому описуєте функції на мові C, щось на кшталт:
extern "C" <
int __declspec (dllimport) Init (int, int);
>
Тепер можна створювати проект VC, перенести в папку проекту всі наші файли і викликати функцію приблизно з такого коду:
#pragma comment (lib, "dccdll.lib")
#include "dccdll.h"
#include
void main () <
printf ( ". \ n", Init (5, 3));
>
Видає 3, що і було потрібно.
Функції з біблоітек на Delphi можуть викликані в C ++ тільки за допомогою LoadLibrary і GetProcAddress (оскільки Delphi НЕ створює lib файлів)
код самої dll треба писати так:
procedure Init; stdcall;
begin
а в С ++ треба писати так
typedef void (__stdcall * LPINITFUNC) ();
void Init ()
<
HMODULE Handle = LoadLibrary ( "dll.dll");
LPINITFUNC InitFunc = GetProcAddress (Handle, "Init");
(* InitFunc) ();
FreeLibrary (Handle);
>
palva: Величезне спасибі! Все вийшло. Що цікаво, в Мережі з цього приводу нічого зрозумілого знайти не вдалося.