🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.delphi
9 messages
9 total messages Started by mwitkowski2b Mon, 23 Jul 2018 07:09
Jak przekazać NULL do funkcji biblioteki DLL
#346676
Author: mwitkowski2b
Date: Mon, 23 Jul 2018 07:09
47 lines
2905 bytes
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.
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);
								  


Czy to jest prawidłowe przekazanie wartości NULL do funkcji?
Czy moja deklaracja funkcji w Delphi odpowiada deklaracji z biblioteki DLL?
Re: Jak przekazać NULL do funkcji biblioteki DLL
#346677
Author: konsul41
Date: Mon, 23 Jul 2018 07:46
45 lines
1843 bytes
> Nie jestem pewien czy podanie wartości 0 jest równoznaczne z wartością NULL?
Nie jest.
		
> 
> 
> Czy to jest prawidłowe przekazanie wartości NULL do funkcji?
> Czy moja deklaracja funkcji w Delphi odpowiada deklaracji z biblioteki DLL?
> 

Nie podałeś w czym jest napisana DLL.
Moim zdaniem nie jest prawidłowo.

To
...
UCHAR* pucImage,
...
pucImage:= 0;
...
jest określeniem początku jakiegoś obszaru pamięci
(prawdopodobnie ciągu znaków lub "rzutowania" na ciąg znaków) 
istniejącego, a null oznacza brak przydzielonego obszaru pamięci.



Dlaczego nie zrobisz tak?
var pucImage : ^AnsiChar;
begin
   pucImage:=nil;
...

lub
var pucImage : PAnsiChar;
begin
   pucImage:=nil;
...

co na jedno wychodzi.

A w zasadzie

var pucImage : ^UChar;
begin
   pucImage:=nil;
...
Re: Jak przekazać NULL do funkcji biblioteki DLL
#346678
Author: 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
Re: Jak przekazać NULL do funkcji biblioteki DLL
#346679
Author: Marek
Date: Mon, 23 Jul 2018 09:49
18 lines
1597 bytes
W dniu 2018-07-23 o 09:09, mwitkowski2b@gmail.com pisze:
> 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.
> Nie jestem pewien czy podanie wartości 0 jest równoznaczne z wartością NULL?

No raczej, przecież "pucImage" to wskaźnik, czyli adres w pamięci i jak podasz 0, to podasz
pusty ("ślepy") adres, czyli NULL.

-- 
Pzdr.
Marek
Re: Jak przekazać NULL do funkcji biblioteki DLL
#346680
Author: konsul41
Date: Mon, 23 Jul 2018 10:47
14 lines
1400 bytes
> 
> No raczej, przecież "pucImage" to wskaźnik, czyli adres w pamięci i jak 
> podasz 0, to podasz
> pusty ("ślepy") adres, czyli NULL.
Nie

The reserved word nil is a special pointer. When nil is assigned to a 
pointer, the pointer does not reference anything.

Wskaźnik o wartości nil(null) wskazuje na nic.
Wskaźnik o adresie 0 wskazuje na coś.

nil(null)<>0
Re: Jak przekazać NULL do funkcji biblioteki DLL
#346681
Author: Marek
Date: Mon, 23 Jul 2018 13:28
19 lines
1510 bytes
W dniu 2018-07-23 o 12:47, konsul41@wp.pl pisze:
>
>>
>> No raczej, przecież "pucImage" to wskaźnik, czyli adres w pamięci i jak podasz 0, to podasz
>> pusty ("ślepy") adres, czyli NULL.
> Nie
>
> The reserved word nil is a special pointer. When nil is assigned to a pointer, the pointer does not reference anything.
>
> Wskaźnik o wartości nil(null) wskazuje na nic.
> Wskaźnik o adresie 0 wskazuje na coś.
>
> nil(null)<>0

https://stackoverflow.com/questions/3577580/using-null-in-c

-- 
Pzdr.
Marek
Re: Jak przekazać NULL do funkcji biblioteki DLL
#346682
Author: konsul41
Date: Tue, 24 Jul 2018 06:20
25 lines
2038 bytes
W dniu 23-07-2018 o 15:28, Marek pisze:
> W dniu 2018-07-23 o 12:47, konsul41@wp.pl pisze:
>>
>>>
>>> No raczej, przecież "pucImage" to wskaźnik, czyli adres w pamięci i 
>>> jak podasz 0, to podasz
>>> pusty ("ślepy") adres, czyli NULL.
>> Nie
>>
>> The reserved word nil is a special pointer. When nil is assigned to a 
>> pointer, the pointer does not reference anything.
>>
>> Wskaźnik o wartości nil(null) wskazuje na nic.
>> Wskaźnik o adresie 0 wskazuje na coś.
>>
>> nil(null)<>0
> 
> https://stackoverflow.com/questions/3577580/using-null-in-c
> 
Sio Do Delphi.

Rzeczywiście w Delphi też równy 0,
https://4programmers.net/Delphi/Nil

Raczej powinno w Delphi używać się nil z uwagi na jasność kodu.
Re: Jak przekazać NULL do funkcji biblioteki DLL
#346683
Author: mwitkowski2b
Date: Tue, 24 Jul 2018 07:13
3 lines
1496 bytes
Bardzo dziękuję wszystkim za pomoc.

Pozdrawiam
Re: Jak przekazać NULL do funkcji biblioteki DLL
#346684
Author: mwitkowski2b
Date: Tue, 24 Jul 2018 08:04
9 lines
1770 bytes
Jeszcze małe podsumowanie:

[1]
W moim przypadku okazało się, ze istotna była zmiana konwencji wywołania 
funkcji z DLL z:
stdcall na cdecl // czyli na konwencję z języka C

[2]
Wygląda na to, ze tam gdzie parametrem funkcji z DLL ma być NULL można przekazać zarówno Nil jak i 0.  W obu przypadkach działa prawidłowo.
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads