Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.03.13;
Скачать: CL | DM;

Вниз

Как вызвать функцию из dll (написанной на Delphi) из VC++   Найти похожие ветки 

 
VaS ©   (2003-03-01 10:38) [0]

Как вызвать функцию из dll (написанной на Delphi) из VC++.

Полистав интернет :) код самой dll пишем так:

procedure Init(); stdcall; export;
begin
end;

exports
Init name "Init@0"; //0 - суммарный размер всех параметров в байтах
end.


Пишем def-файл:

library TDLL
description "TDLL Library"
exports
Init@0


и включаем его в проект VC.

В VC пишем:

extern "C"
{
_declspec(dllimport) _stdcall void Init();
}

Init();


Компоновщик на это говорит:

tdll_client error LNK2019: unresolved external symbol __imp__Init@0

Варианты объявления без __stdcall, без extern "C" дают тот же эффект, кроме имени ненайденной функции (_Init@0, _Init).

Вообще возможно статическое связывание или же только динамичесокое?


 
palva   (2003-03-01 13:25) [1]

Если уж делать библиотеку для использования исключительно из C/C++, то удобно воспользоваться стандартными средствами VC, (которыми вы и пытаетесь пользоваться). Для этого в паскалевском тексте нужно указать, что функции вызываются в соглашениях cdecl, а не stdcall. Я поправил ваш текст так:

library dccdll;
function Init(a, b: integer): integer; cdecl; export;
begin
Init := a - b + 1;
end;
exports
Init;
end.

Предположим, вы изготовили библиотеку путем запуска

dcc32 dccdll.pas

и получили библиотеку dccdll.dll. Что делать дальше.

Натравливаете на нее борландовскую утилиту impdef:

impdef dccdll.def dccdll.dll

и получаете файл dccdll.def - В нашем случае это будет

LIBRARY DCCDLL.DLL

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 <stdio.h>
void main() {
printf("%d\n", Init(5, 3));
}

Выдает 3, что и требовалось.


 
Dimka Maslov ©   (2003-03-01 15:03) [2]

Функции из библоитек на Delphi могут вызваны в C++ только при помощи LoadLibrary и GetProcAddress (поскольку Delphi не создаёт lib файлов)

код самой dll надо писать так:

library dll;

procedure Init; stdcall;
begin

end;

exports
Init;

end.


а в С++ надо писать так

typedef void (__stdcall *LPINITFUNC) ();

void Init()
{
HMODULE Handle = LoadLibrary("dll.dll");
LPINITFUNC InitFunc = GetProcAddress(Handle, "Init");
(*InitFunc)();
FreeLibrary(Handle);
}

}


 
VaS ©   (2003-03-01 15:18) [3]

palva: Огромное спасибо! Все получилось. Что интересно, в Сети по этому поводу ничего вразумительного найти не удалось.



Страницы: 1 вся ветка

Текущий архив: 2003.03.13;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.016 c
7-39583
bavc
2003-01-14 10:14
2003.03.13
Помогите узнать конфиг. оборудования


14-39505
romychk
2003-02-25 13:40
2003.03.13
FreePascal


1-39308
Андрусь
2003-02-28 14:46
2003.03.13
функция для форматирования длинных строк в мессагах


14-39547
michael_b
2003-02-26 16:55
2003.03.13
Где взять описание стандарта Pascal я?


1-39250
KoluChi
2003-03-03 09:59
2003.03.13
Как распаковать архив из памяти