Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-39318
Max1111
2003-03-04 15:18
2003.03.13
Не могу добавть строку в Memo....Help


6-39457
H-A-O-S
2003-01-23 13:53
2003.03.13
КУКИСЫ!!!!


14-39508
Карелин Артем
2003-02-25 15:19
2003.03.13
Есть Сервер под 2К.


14-39491
apple11
2003-02-25 06:50
2003.03.13
Почему D6 неправильно открывает проект ?


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский