Форум: "Основная";
Текущий архив: 2003.03.13;
Скачать: [xml.tar.bz2];
ВнизКак вызвать функцию из 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.007 c