Этот вопрос наверно уже 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 >>
Здравствуйте, 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>>
Спасибо — попробуем.
Насчет JEDI: В куске проги LoadModule и GetModuleSymbol из JEDI.
... << RSDN@Home 1.1.3 stable >>