Як викликати функцію з dll (написаної на delphi) з vc

Як викликати функцію з 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: Величезне спасибі! Все вийшло. Що цікаво, в Мережі з цього приводу нічого зрозумілого знайти не вдалося.