Article View: pl.comp.lang.delphi
Article #346678Re: Jak przekazać NULL do funkcji biblioteki DLL
From: Roman Tyczka
Date: Mon, 23 Jul 2018 09:22
Date: Mon, 23 Jul 2018 09:22
93 lines
3739 bytes
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-mailReferences:
<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