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
Author: mwitkowski2b
Date: Mon, 23 Jul 2018 07:09
Date: Mon, 23 Jul 2018 07:09
47 lines
2905 bytes
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
Author: konsul41
Date: Mon, 23 Jul 2018 07:46
Date: Mon, 23 Jul 2018 07:46
45 lines
1843 bytes
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
Author: 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
Re: Jak przekazać NULL do funkcji biblioteki DLL
Author: Marek
Date: Mon, 23 Jul 2018 09:49
Date: Mon, 23 Jul 2018 09:49
18 lines
1597 bytes
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
Author: konsul41
Date: Mon, 23 Jul 2018 10:47
Date: Mon, 23 Jul 2018 10:47
14 lines
1400 bytes
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
Author: Marek
Date: Mon, 23 Jul 2018 13:28
Date: Mon, 23 Jul 2018 13:28
19 lines
1510 bytes
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
Author: konsul41
Date: Tue, 24 Jul 2018 06:20
Date: Tue, 24 Jul 2018 06:20
25 lines
2038 bytes
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
Author: mwitkowski2b
Date: Tue, 24 Jul 2018 07:13
Date: Tue, 24 Jul 2018 07:13
3 lines
1496 bytes
1496 bytes
Bardzo dziękuję wszystkim za pomoc. Pozdrawiam
Re: Jak przekazać NULL do funkcji biblioteki DLL
Author: mwitkowski2b
Date: Tue, 24 Jul 2018 08:04
Date: Tue, 24 Jul 2018 08:04
9 lines
1770 bytes
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