🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.delphi
Article #346678

Re: Jak przekazać NULL do funkcji biblioteki DLL

#346678
From: Roman Tyczka
Date: Mon, 23 Jul 2018 09:22
93 lines
3739 bytes
On Mon, 23 Jul 2018 00:09:26 -0700 (PDT), mwitkowski2b@gmail.com wrote:

> Mam do wykorzystania bibliotekę DLL, do której mam API, która zawiera np. deklarację funkcji jak poniżej:
> 
> int GetPicture(UCHAR ucInstance, 
>                UCHAR* pucImage, 
>                UINT* puiBufSize, 
> 	       UINT* puiWidth, 
> 	       UINT* puiHeight );
> 				 
> Przy pierwszym wywołaniu mam podać jako drugi parametr pucImage=NULL, trzeci puiBufSize=0.

Prawdopodobnie chodzi tu o wywołanie tej funkcji dwukrotnie, pierwszy raz
po to by uzyskać rozmiar obrazka, co będzie potrzebne do zaalokowania
pamięci przed drugim wywołaniem, które pobierze już ten obrazek.

> Nie jestem pewien czy podanie wartości 0 jest równoznaczne z wartością NULL?
> Próbuję coś takiego, najpierw tworze sobie odpowiedni typ do wskazania tej funkcji oraz zmienną, która będzie jej adres zawierać:
> 
> Type_GetPicture = function(ucInstance: UCHAR;
>                            pucImage: PUCHAR;
>                            puiBufSize: PUINT;
>                            puiWidth: PUINT;
>                            puiHeight: PUINT
>                            ) : Integer; stdcall;
> 
> var
>   GetPicture : Type_GetPicture;
> 
> Ładuję bibliotekę DLL dynamicznie, pobieram adres funkcji z dll do GetPicture, po czym ją wywołuję w następujący sposób:
> 
> var  
>   iSize: Integer;
>   pucImage: UCHAR;
>   puiBufSize: UINT;
>   puiWidth: UINT;
>   puiHeight: UINT;							
>   ...  
>   lInstance:= 1;
>   pucImage:= 0;
>   puiBufSize:=0;
>   puiWidth:= 0;
>   puiHeight:= 0;
> 
>   iSize := ob.GetPicture(lInstance,
>                          @pucImage,
>                          @puiBufSize,
>                          @puiWidth,
>                          @puiHeight);

Spróbuj jakoś tak:

 var  
   iSize: Integer;
   pucImage: PUCHAR;
   puiBufSize: UINT;
   puiWidth: UINT;
   puiHeight: UINT;							
  ...  
   lInstance := 1;
   pucImage := nil;
   puiBufSize :=0;
   puiWidth := 0;
   puiHeight := 0;
 
   //pobranie rozmiaru obrazu
   iSize := ob.GetPicture(lInstance,
                          pucImage,
                          @puiBufSize,
                          @puiWidth,
                          @puiHeight);
   
   //alokacja bufora na obraz
   GetMem(pucImage, iSize); 
   puiBufSize := iSize;

   //pobranie danych obrazu
   iSize := ob.GetPicture(lInstance,
                          pucImage,
                          @puiBufSize,
                          @puiWidth,
                          @puiHeight);
   
  //i teraz w pubImage powinienes miec ten obrazek a w puiWidth i puiHeight
jego wymiary


Jeszcze nie jestem pewien czy stdcall to poprawna konwencja, być może
powinno być cdecl, ale to powinno być w dokumentacji DLLki.

-- 
pozdrawiam
Roman Tyczka
Technical Details
Message-ID: <ki5duxjls4ce$.dlg@tyczka.com>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!.POSTED!not-for-mail
References: <a8f14f86-85d7-4e11-ac08-fa595894e6d0@googlegroups.com>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!.POSTED!not-for-mail
From: Roman Tyczka <noemail@because.no>
Newsgroups: pl.comp.lang.delphi
Subject: Re: Jak przekazać NULL do funkcji biblioteki DLL
Date: Mon, 23 Jul 2018 11:22:49 +0200
Organization: ATMAN - ATM S.A.
Lines: 93
Sender: romek@tyczka.no.found
Message-ID: <ki5duxjls4ce$.dlg@tyczka.com>
References: <a8f14f86-85d7-4e11-ac08-fa595894e6d0@googlegroups.com>
NNTP-Posting-Host: ip-94-75-90-137.wave.com.pl
Mime-Version: 1.0
X-Trace: node1.news.atman.pl 1532337769 23026 94.75.90.137 (23 Jul 2018 09:22:49 GMT)
X-Complaints-To: usenet@atman.pl
NNTP-Posting-Date: Mon, 23 Jul 2018 09:22:49 +0000 (UTC)
User-Agent: 40tude_Dialog/2.0.15.84
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit