Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

работа с dll [D7, WinXP]


belmol ©   (2008-12-17 16:28:00) 

есть вот такой пример на с++
#pragma  once
#include "..\\sfud\\sfuddll.h"

#define PS_API extern "C" __declspec(dllexport)

PS_API BOOL _stdcall PS_InitSDK();
PS_API BOOL _stdcall PS_UnInitSDK();
PS_API BOOL _stdcall PS_IsFtrConnected();
PS_API int _stdcall PS_GetTimeout();
PS_API BOOL _stdcall PS_SetTimeout(int timeout);
PS_API BOOL _stdcall PS_IsFingerOn();
PS_API BOOL _stdcall PS_Capture();
PS_API void _stdcall PS_AbortCapturing();
PS_API int _stdcall PS_GetImageWidth();
PS_API int _stdcall PS_GetImageHeight();
PS_API void _stdcall PS_Clear();
PS_API void _stdcall PS_Draw(HWND hWnd, int l, int t, int r, int b, int bCore);
PS_API int _stdcall PS_Enroll(unsigned char* Template, int* TemplateSize, int bCoreDetect);
PS_API int _stdcall PS_GetEnrollQuality();
PS_API BYTE* _stdcall PS_GetImageBuffer();
PS_API int _stdcall PS_Idenify(BYTE* ImageBuf,BYTE** Templates, int Count, int* Match, int SecurityLevel, int bCoreDetect, int Timeout,int ImageWidth,int ImageHeight);
PS_API int _stdcall PS_IdentifyTemplates(BYTE* Template1,BYTE* Template2,int SecurityLevel);
PS_API BOOL _stdcall PS_InitSDKFtr();
PS_API BOOL _stdcall PS_SetDiod(DIOD_STATUS status);
PS_API BOOL _stdcall PS_SaveImage(int user_id,int fng_id);

вот что у меня получилось

procedure TForm36.Click(Sender: TObject);
type
TPS_UnInitSDK = function ():boolean;
type
TPS_InitSDKFtr = function ():boolean;
type
TPS_InitSDK = function ():boolean;
type
TPS_SetDiod = function (status:LongInt):boolean;
type
TPS_GetTimeout = function ():integer;
type
TPS_Capture = function ():boolean;
type
TPS_IsFtrConnected = function ():boolean;
type
TPS_Draw = procedure (hWnd:THANDLE; l,t,r,b:integer; bCore: boolean);
type
TPS_IsFingerOn = function ():boolean;
var
DLLInstance : THandle;
PS_InitSDKFtr :TPS_InitSDKFtr;
PS_InitSDK :TPS_InitSDK;
PS_GetTimeout:TPS_GetTimeout;
PS_SetDiod:TPS_SetDiod;
PS_Capture:TPS_Capture;
PS_IsFtrConnected:TPS_IsFtrConnected;
PS_Draw:TPS_Draw;
PS_UnInitSDK:TPS_UnInitSDK;
PS_IsFingerOn:TPS_IsFingerOn;
i: integer;
begin
// ïîäêëþ÷àåì áèáëèîòåêó
DLLInstance := LoadLibrary('ProSoftSDK.dll');
if DLLInstance = 0 then begin
  MessageDlg('Íåâîçìîæíî çàãðóçèòü DLL', mtError, [mbOK], 0);
  Exit;
end;
//----------------------------------- PS_InitSDK  (àêòèâèðóåì ñêàíåð)
@PS_InitSDK := GetProcAddress(DLLInstance, '_PS_InitSDK@0');
if @PS_InitSDK nil then
 begin
   PS_InitSDK;
   @PS_IsFtrConnected := GetProcAddress(DLLInstance, '_PS_IsFtrConnected@0');
   if @PS_IsFtrConnected nil then
     if PS_IsFtrConnected then
       for i:=0 to 5 do
       begin
         //-----------------------------------TPS_Capture
         @PS_Capture := GetProcAddress(DLLInstance, '_PS_Capture@0');
         if @PS_Capture nil then
           if PS_Capture then
             begin
               @PS_Draw := GetProcAddress(DLLInstance, '_PS_Draw@24');
               if @PS_Draw nil then
                PS_Draw(image11.Canvas.Handle,0,0,image11.Width,image11.Height,true)
               else
                 MessageDlg('Íå íàéäåíà PS_Draw ïðîöåäóðà!.', mtError, [mbOK], 0);
             end
         else
           begin
           MessageDlg('Íå íàéäåíà PS_Capture ïðîöåäóðà!.', mtError, [mbOK], 0);
           ShowMessage(SysErrorMessage(GetLastError));
           end;
       end
   else
     MessageDlg('Íå íàéäåíà PS_IsFtrConnected ïðîöåäóðà!.', mtError, [mbOK], 0);
 end
else
  MessageDlg('Íå íàéäåíà PS_InitSDK ïðîöåäóðà!.', mtError, [mbOK], 0);
//----------------------------------- PS_UnInitSDK
@PS_UnInitSDK := GetProcAddress(DLLInstance, '_PS_UnInitSDK@0');
if @PS_UnInitSDK nil then
  PS_UnInitSDK
else
  MessageDlg('Íå íàéäåíà PS_UnInitSDK ïðîöåäóðà!.', mtError, [mbOK], 0);
FreeLibrary(DLLInstance);
end;

в итоге выдает
не найдена  PS_Capture процедура, хотя указано все верно,
при проверке на вшивость ShowMessage(SysErrorMessage(GetLastError))
выдает   Недостаточно памяти для обработки команды ((

кто скажет как отловить проблемму?


belmol   (2008-12-19 08:15:00) [1]

еще вопрос
PS_API void _stdcall PS_Draw(HWND hWnd, int l, int t, int r, int b, int bCore);
HWND hWnd - хандл я так понял имаджа куда пихать картинку полученную в процессе сканирования..  
int l, int t,  -- координаты окна (0,0)
int r, int b, - высота и ширина картинки
int bCore - отмечать крестиком или не отмечать контрольные точки на рисунке (сканирование отпечатка пальцев тут идет)

проблеммка такая что он заливает в имадж чисто белый фон. может событие где то не так прописанно??

begin
// подключаем библиотеку
i:=0;
if dll_loaded then
//----------------------------------- PS_InitSDK  (активируем sdk)
 if sdk_connect then
//----------------------------------- подключен ли сканер
   if scaner_Connected then
    begin
//----------------------------------- покажи таймаут
     showmessage('Таймаут составляет '+IntToStr(GetTimeout)+' миллисекунд '+#13+'Ширина ровна '+IntToStr(image_Width)+' пикселей '+#13+'Высота ровна '+IntToStr(image_Height)+' пикселей ');
         while (image11.Picture.Graphic = nil) do
          begin
             diod(2);
             if Capture then
               if Draw_image then Imageloaded;
             //else MessageDlg('не запущена capture', mtError, [mbOK], 0);
             if i>20 then goto exit1;
             i:=i+1;
          end;
       end
   else  MessageDlg('Сканер не подключен!!', mtError, [mbOK], 0);
exit1:
//Capture_abort;
try
diod(1);
sdk_disconnect;
dll_unloaded;
finally end;
end;


belmol   (2008-12-18 14:46:00) [2]

спасибо!


clickmaker   (2008-12-18 14:15:00) [3]

TPS_Draw = procedure (hWnd:THANDLE; l,t,r,b:integer; bCore: boolean); stdcall;


belmol   (2008-12-18 14:13:00) [4]

>Не могут они выполняться правильно, потому что ты не указал stdcall.
>Если для ф-ций без параметров это еще незаметно "прокатит", то при вызове TPS_Draw ты просто обязан встетить грабли во весь рост.

а где указывать stdcall ??


belmol   (2008-12-18 14:11:00) [5]

так оно и есть )


Сергей М.   (2008-12-18 08:59:00) [6]


> все остальные функции импортируются


Ну так а что гадать ?

Посмотри любым дампером/вьюером фактическиэкспортируемое имя проблемной функции - и все встанет на свои места.


> и выполняются


Не могут они выполняться правильно, потому что ты не указал stdcall.
Если для ф-ций без параметров это еще незаметно "прокатит", то при вызове TPS_Draw ты просто обязан встетить грабли во весь рост.


wal   (2008-12-18 08:49:00) [7]

Ну и наконец BOOL и boolean несколько разные вещи


belmol   (2008-12-18 07:26:00) [8]

так самое интересное что все остальные функции импортируются и выполняются


Сергей М.   (2008-12-17 16:46:00) [9]

+ [1]

а также наводит на мысль, что соглашение о вызове может быть stdcall, но никак не pascal fastcall


clickmaker   (2008-12-17 16:39:00) [10]

> #define PS_API extern "C" __declspec(dllexport)

это наводит на мысль, что имена функций там таки не декорированы. Т.е. не _PS_Capture@0, а PS_Capture'


Наверх

Титульная страница Поиск, карта сайта Написать письмо