Главная страница
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.011 c
3-39161
denis24
2003-02-20 13:02
2003.03.13
движение курсора в DBGRID


1-39305
Хоттабыч
2003-03-04 10:43
2003.03.13
PrinterSetup и принтер по умолчанию


3-39230
iusup
2003-02-22 22:15
2003.03.13
Как сохранить изменения в DB...?


3-39194
Ihtiandr
2003-02-18 18:02
2003.03.13
insert


14-39472
Anonimus
2003-02-27 09:56
2003.03.13
Скажите плиз где взять пример работы с MS Agentом на дельфи??