Экспорт функций из DLL в Delphi
От: Gluk5000  
Дата: 17.10.04 17:34
Оценка:
Этот вопрос наверно уже 1000 раз задавался, но тем не менее.
Есть DLL, есть lib для VC++, есть хидер .h
Пример функции из хидера

#if (defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__)) && !defined(_NI_mswin16_)
#define _VI_FAR
#define _VI_FUNC __stdcall
#define _VI_FUNCC __cdecl
#define _VI_FUNCH __stdcall
#define _VI_SIGNED signed
#elif defined(_CVI_) && defined(_NI_i386_)
#define _VI_FAR
#define _VI_FUNC _pascal
#define _VI_FUNCC
#define _VI_FUNCH _pascal
#define _VI_SIGNED signed
#endif

typedef unsigned long ViUInt32;
typedef _VI_SIGNED long ViInt32;
typedef unsigned short ViUInt16;
typedef _VI_SIGNED short ViInt16;
typedef char ViChar;
typedef ViChar* ViString;
typedef ViString ViRsrc;
typedef double ViReal64;
typedef ViUInt16 ViBoolean;
typedef ViInt32 ViStatus;
typedef ViUInt32 ViSession;

ViStatus _VI_FUNC rsnrpz_init(
ViRsrc resourceName,
ViBoolean IDQuery,
ViBoolean resetDevice,
ViSession* pInstrumentHandle
);

Как лучше всего использовать сию DLL в проекте на Delphi. Использую JEDI версии 2.

Интересуют следующие вопросы:
1. Использовать статическое или динамическое подключение библиотеки? Как использовать и то, и то подключение?
2. Если использовать статическое подключение, то как переписывать хидер под Delphi? Как подключать DLL к проекту.
3. Если использовать динамическое подключение, то как передавать параметры в функцию из примера например? Как описать указатель на функцию?

Пытался использовать динамическое подключение. Сделал такой указатель:
type
Trsnrpz_init = function(
const resourceName: AnsiString;
IDQuery: Word;
resetDevice: Word;
var pInstrumentHandle: Cardinal): Smallint;
var
rsnrpz_init: Trsnrpz_init;

begin
if LoadModule(Module, 'rsnrpz_32.dll') then
begin
rsnrpz_init := GetModuleSymbol(Module, 'rsnrpz_init'); //Ищем функцию и даже находим
tst := rsnrpz_init('USB:*', 1, 1, RPZ_Session); //Все нормально, но такое чувство, что параметры неправильно передаются
end;
end;

Лишнее опустил. Можете попинать меня, но лучше напишите как надо делать. Если что могу дать ссылку на библиотечку.

P.S. На Delphi не пишу. Нет желания. Использую С и ASM и не под x86. Так что за незнание WinAPI не пинайте и т.д. и т.п. Соответственно в программировании под Windows я полный дуб. Но быстро учусь.
P.S.S. Если увидите ошибки в посте — не обессудьте. На клаве нет русских букв.
... << RSDN@Home 1.1.3 stable >>
Re: Экспорт функций из DLL в Delphi
От: alive Россия  
Дата: 17.10.04 19:50
Оценка:
Здравствуйте, Gluk5000, Вы писали:

G>Как лучше всего использовать сию DLL в проекте на Delphi. Использую JEDI версии 2.

Причем JEDI не понял

G>Интересуют следующие вопросы:

G>1. Использовать статическое или динамическое подключение библиотеки? Как использовать и то, и то подключение?
Что удобней . При статическом меньше лишнего кода при динамическом контроль за загрузкой библиотеки и возможность корректно обработать ошибки
G>2. Если использовать статическое подключение, то как переписывать хидер под Delphi? Как подключать DLL к проекту.
interface

function rsnrpz_init(const resourceName: AnsiString;IDQuery: Word;resetDevice: Word; var pInstrumentHandle: Cardinal): Longint; stdcall;

implementation

function rsnrpz_init; external 'yourlib.dll' name 'rsnrpz_init' //либо index N если известен индекс

G>3. Если использовать динамическое подключение, то как передавать параметры в функцию из примера например? Как описать указатель на функцию?

Все также как у вас только см. выделенное

G>Пытался использовать динамическое подключение. Сделал такой указатель:

G>type
G> Trsnrpz_init = function(
G> const resourceName: AnsiString;
G> IDQuery: Word;
G> resetDevice: Word;
G> var pInstrumentHandle: Cardinal): Longint; stdcall
G>var
G> rsnrpz_init: Trsnrpz_init;

var
    DLLHandle
    
DLLHandle:= LoadLibrary('yourlib.dll');
if DLLHandle <> 0 then
    @rsnrpz_init:= GetProcAddress(DLLHandle, 'rsnrpz_init')
    
//Работаем с функцией

FreeLibrary(DLLHandle);
... << RSDN@Home 1.1.4 beta 3 rev 205 >> <<Queen — White Man>>
Keep yourself alive
Re[2]: Экспорт функций из DLL в Delphi
От: Gluk5000  
Дата: 17.10.04 21:01
Оценка:
Спасибо — попробуем.
Насчет JEDI: В куске проги LoadModule и GetModuleSymbol из JEDI.
... << RSDN@Home 1.1.3 stable >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.