вызов функции из dll

Boris3box
Дата: 11.10.2006 10:25:19
есть функция в библиотеке winAztec32
Gets the actual size of the Aztec barcode which is rendered onto either computer screen or other devices such as printers.

void AztecGetActualSize(BOOL ScreenIsTarget,

DWORD TargetHDC,

DWORD *ActualWidth,

DWORD *ActualHeight);


Parameters

ScreenIsTarget

Indicates whether the Aztec barcode is rendered onto computer screen or not.

TargetHDC

Device context on which to render the Aztec barcode, if the parameter ScreenIsTarget is set to TRUE, set this parameter to NULL.

ActualWidth

A pointer to the variable that receives the width of the Aztec barcode (in pixels).

ActualHeight

A pointer to the variable that receives the height of the Aztec barcode (in pixels).


не получается вызвать ее.
Она должна получать параметры размера рисунка(кода AZTEC).
две функции из библиотеки уже вызваны:
TBOBSetDefault = function() : Integer;

TBOBSetMessage = function(str : string) : Integer;

TGetActualSize = function(ScreenIsTarget : Boolean;

TargetHDC : variant;
var
ActualWidth : mtype;
ActualHeight : mtype
) : Integer;


а это текст вызова функций:
begin
sstr := 'fff';
sstr1 := 'dfgf';
f1 := 0;
f2 := 22;
f3 := 31;
{ Загружаем и получаем дескриптор нашего BLODGE.DLL }
hDLLInst := LoadLibrary('AztecWin32.DLL');
{ Если загрузка не была успешной, генерируем свое исключение }
if (hDLLInst <= 0) then
raise exception.create('[Неудачный вызов LoadLibrary]');
{ Попытаемся получить адрес функции BOB }
try
@BOBSetDefault := GetProcAddress(hDLLInst, 'AztecSetDefault');
if not assigned(BOBSetDefault) then
raise exception.Create('[Неудачный вызов AztecSetDefault]');
{ Теперь мы можем выполнить функцию BOB }
BOBSetDefault();
finally
end;

try
@BOBSetMessage := GetProcAddress(hDLLInst, 'AztecSetMessage');
if not assigned(BOBSetMessage) then
raise exception.Create('[Неудачный вызов AztecSetMessage]');
{ Теперь мы можем выполнить функцию BOB }
BOBSetMessage('какойто текст');


finally
{ Освобождаем дескриптор DLL }
// FreeLibrary(hDLLInst);
end;
try
@GetActualSize := GetProcAddress(hDLLInst, 'AztecGetActualSize');
if not assigned(GetActualSize) then
raise exception.Create('[Неудачный вызов GetActualSize]');
{ Теперь мы можем выполнить функцию BOB }
GetActualSize(true, 0,y1,y2);
finally
end;
Boris3box
Дата: 11.10.2006 10:28:58
библиотеке AztecWin32
A.K.
Дата: 11.10.2006 12:42:48
Boris3box
библиотеке AztecWin32


1) зачем создавать новую тему? 2 дня назад вопрос вами же обсуждался
2) не получается вызвать, потому что не сооответствуют типы и calling conventions.

у вас функция:
[SRC С]void AztecGetActualSize(BOOL ScreenIsTarget, DWORD TargetHDC, DWORD *ActualWidth, DWORD *ActualHeight);[/src]
на паскале нужно описать:
а) раз возвращает void - значит procedure
б) на каком основании вы заменяете DWORD на Variant? это совсем не одно и тоже
в) если это стандартная Сишная функция, то надо бы добавить stdcall;

Откройте для начала модуль WINDOWS.PAS в Delphi и сравните описания функций там и в Win32 API Reference. Это поможет вам понять, как нужно описать вашу функцию (процедуру)
A.K.
Дата: 11.10.2006 12:45:17
и еще совет: текст вопроса настолько нечитабельный, что вряд ли многие участники будут его читать. есть же тэги SRC, B, ...
A.K.
Дата: 11.10.2006 12:46:42
у вас функция:
void AztecGetActualSize(BOOL ScreenIsTarget, DWORD TargetHDC, DWORD *ActualWidth, DWORD *ActualHeight);
на паскале нужно описать:
а) раз возвращает void - значит procedure
б) на каком основании вы заменяете DWORD на Variant? это совсем не одно и тоже
в) если это стандартная Сишная функция, то надо бы добавить stdcall;

Откройте для начала модуль WINDOWS.PAS в Delphi и сравните описания функций там и в Win32 API Reference. Это поможет вам понять, как нужно описать вашу функцию (процедуру)
A.K.
Дата: 11.10.2006 12:55:24
uses Windows;
// ...
procedure AztecGetActualSize(ScreenIsTarget: BOOL, TargetHDC:DWORD,  ActualWidth: PDWORD, ActualHeight: PDWORD); stdcall; 

Если не нравятся оригинальные сишные названия типов, импортированные в windows.pas для API-функций, используйте более паскалевые, но соответствующие:

type
  DWORD = LongWord;
  BOOL = LongBool;
  PDWORD = ^DWORD;
alex0
Дата: 11.10.2006 13:02:28
Boris3box

TBOBSetMessage = function(str : string) : Integer;

Сомневаюсь что эта функция правильно объявлена, в оригинале наверное Pchar был?
evvcom
Дата: 11.10.2006 13:37:51
A.K.
в) если это стандартная Сишная функция, то надо бы добавить stdcall;

скорее все же cdecl