Главная страница
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.022 c
1-39299
Sirus
2003-03-04 08:56
2003.03.13
Как блокировать файла от копирования???


1-39320
anbezr
2003-03-04 15:42
2003.03.13
Ответ окна на сообщение.


14-39526
pcgamer
2003-02-26 11:45
2003.03.13
Кодеры () и дизайнеры. Давайте объединяться и обмениваться инфой.


3-39223
Ahmad K
2003-02-23 00:13
2003.03.13
Как узнать номер последней записи в BD?


14-39521
Sergey Masloff
2003-02-23 09:53
2003.03.13
Распродажа книг