Problem z dll napisanym w c++

0

Mam dLL napisany w c++ i opis też jest do c++. A mianowicie

POS_GetResponseValue (
POSNET_HANDLE hRequest, 
const char * paramName, 
char * retVal, 
unsigned long retValLen 
)

Parametry

hRequest - Uchwyt zapytania/odpowiedzi
paramName - Wskaźnik do bufora znakowego, w którym znajduje się nazwa poszukiwanego pola odpowiedzi
retVal - Wskaźnik do bufora znakowego, w którym funkcja umieści odebrany ciąg znaków. Aplikacja musi zapewnić odpowiednią pojemność bufora, którą przekazuje w parametrze retValLen. W przypadku zbyt krótkiego bufora zostanie zwrócony błąd
retValLen- Długość bufora

Więc odwołuję się pod delphi to dll tak:

function POS_GetResponseValue(hRequest: Pointer; paramName: PansiChar; retVal: PansiChar; retValLen:LongInt) : LongInt ;  Stdcall; External 'test.dll';

Następnie wywołuję funkcję tak:

 
w var buf:PAnsiChar;

POS_GetResponseValue(hRequest,PAnsiChar('da'),PAnsiChar(buf),250);

I niestety nie działa, wywala błąd...
Gdzie może być błąd?

0

DLL ma własną pamięć więc nie możesz tak po prosu przekazać napis, musisz użyć GlobalAlloc.

Serio? To znaczy że zawsze źle wywoływałem WinApi?

Gdzie może być błąd?

Błąd jest w tym że nie podałeś jaki to błąd. A na twoje pytanie odpowie ci debugger którego użyć nie umiesz.
Najprawdopodobniej jesteś na tyle genialny że w Delphi stwierdziłeś że call to typ 'stdcall' a c++ domyślnie używa 'cdecl'.

0
-321oho napisał(a):

DLL ma własną pamięć więc nie możesz tak po prosu przekazać napis, musisz użyć GlobalAlloc.

Serio? To znaczy że zawsze źle wywoływałem WinApi?

Gdzie może być błąd?

Błąd jest w tym że nie podałeś jaki to błąd. A na twoje pytanie odpowie ci debugger którego użyć nie umiesz.
Najprawdopodobniej jesteś na tyle genialny że w Delphi stwierdziłeś że call to typ 'stdcall' a c++ domyślnie używa 'cdecl'.

Błąd 65794....
ma być stdcall bo tak jest według dokumentacji od biblioteki...

0

Błąd 65794....

Też potrafię powiedzieć nonsens: błąd leży w linii X.

ma być stdcall bo tak jest według dokumentacji od biblioteki...

A ja w kodzie w C++ nie widzę żadnej deklaracji za to odpowiadającej.

0
-321oho napisał(a):

Błąd 65794....

Też potrafię powiedzieć nonsens: błąd leży w linii X.

ma być stdcall bo tak jest według dokumentacji od biblioteki...

A ja w kodzie w C++ nie widzę żadnej deklaracji za to odpowiadającej.

To nie numer lini tylko numer błędu jaki zwraca funkcja ;-)
No jeżeli w dokumentacji pdoali że jest __stdcall tzn że jest zresztą inne funkcje są wywoływane z stdcall i działają...

ps. to co napisał 13th Dragon o GlobalAlloc to dobra wskazówka bo zaczyna trybić :)

0

To nie numer lini tylko numer błędu jaki zwraca funkcja

Raczej: To obrazuje na jakim poziomie jest u ciebie używanie debuggera. Na żadnym.

ps. to co napisał 13th Dragon o GlobalAlloc to dobra wskazówka bo zaczyna trybić

Bah, zaraz się okaże że DLL nie jest w jednej przestrzeni adresowej z EXEkiem.

Tak, absolutnie serio, DLL nie może pisać po pamięci przydzielonej w twoim programie, bez GMEM_SHARE normalny String przydzielany bez tego.

Nie może pisać do stringa, bo jest on w sekcji READ only? (to się dzieje gdy const string piszesz) Spróbuj sobie tak zrobić z tablicą dynamiczną.

Ale rzeczywiście, procka wymaga stringa jako out, więc trzeba zaalokować pamięć co dla pytacza jest zbyt trudne i co widać podawaniem losowej wartości do ostatniego parametru.

0
-321oho napisał(a):

To nie numer lini tylko numer błędu jaki zwraca funkcja

Raczej: To obrazuje na jakim poziomie jest u ciebie używanie debuggera. Na żadnym.
A co mam ci podać z debuggera ? byś mógł pomóc zamiast się mądrować?

ps. to co napisał 13th Dragon o GlobalAlloc to dobra wskazówka bo zaczyna trybić

Bah, zaraz się okaże że DLL nie jest w jednej przestrzeni adresowej z EXEkiem.

Tak, absolutnie serio, DLL nie może pisać po pamięci przydzielonej w twoim programie, bez GMEM_SHARE normalny String przydzielany bez tego.

Nie może pisać do stringa, bo jest on w sekcji READ only? (to się dzieje gdy const string piszesz) Spróbuj sobie tak zrobić z tablicą dynamiczną.

Ale rzeczywiście, procka wymaga stringa jako out, więc trzeba zaalokować pamięć co dla pytacza jest zbyt trudne i co widać podawaniem losowej wartości do ostatniego parametru.

Forum służy do tego by zadawać pytanie i czegoś się nauczyć.

3
gerffi napisał(a):

Forum służy do tego by zadawać pytanie i coś się nauczyć.

Jak mówię użyj debuggera to znaczy użyj debuggera, nie jestem twoją niańką żeby ci podsyłać linki do kursów. Ja ci tej wiedzy do głowy łopatą nie włożę. To od ciebie zależy czy się nauczysz debuggować czy nie.

0

Spróbuj

function POS_GetResponseValue(hRequest: Pointer; const paramName: PAnsiChar; retVal: PAnsiChar; retValLen:LongInt): LongInt; stdcall; external 'test.dll';

i wywołanie:

var
  buf: array [0..250] of Char;
  hRequest: Pointer;
begin
  POS_GetResponseValue(hRequest, PAnsiChar('da'), buf, SizeOf(buf));
end;

Tylko nie wiem co to jest ten hRequest skoro to do czegoś uchwyt to czy to na pewno Pointer? Jak to POSNET_HANDLE jest zadeklarowane w C++ ?

0
-321oho napisał(a):
gerffi napisał(a):

Forum służy do tego by zadawać pytanie i coś się nauczyć.

Jak mówię użyj debuggera to znaczy użyj debuggera, nie jestem twoją niańką żeby ci podsyłać linki do kursów. Ja ci tej wiedzy do głowy łopatą nie włożę. To od ciebie zależy czy się nauczysz debuggować czy nie.

Jak masz problem z odpowiadaniem początkującym to po co odpowiadasz?

gerffi napisał(a):

Forum służy do tego by zadawać pytanie i czegoś się nauczyć.

Ogólnie masz rację, ale zdarzają się ludzie (zwłaszcza jeśli są anonimowi) którzy odpowiadają nie wiadomo po co.

...natomiast Tobie przyda się: http://rtfm.killfile.pl/

  • nie podałeś komunikatu błędu, "nie działa" to informacja na poziomie użytkownika a nie programisty
0

Jak masz problem z odpowiadaniem początkującym to po co odpowiadasz?

Nie ja mam problemu, on ma problem z użyciem stron w stylu www.google.pl . I poza tym, widać nie chce być traktowany jako newbie bo pisze w dziale dedykowanym poważniejszym zagadnieniom. Ja bardzo lubię odpowiadać początkującym, a zwłaszcza takim geniuszom którzy myślą że są jacyś wyjątkowi bo nowi, google obowiązują wszystkich. To samo tyczy się znajomości składni języka itd., bo ja nie mam magicznej łopaty do wkładania wiedzy.

  • nie podałeś komunikatu błędu, "nie działa" to informacja na poziomie użytkownika a nie programisty

Nie działa to nawet nie jest na poziomie użytkownika, na poziomie lamy. Nawet jakiś użyszkodnik czasami ma na tyle oleju w głowie żeby powiedzieć JAKI błąd.

buf: array [0..250] of Char;

Czy tylko mi się wydaje że mamy do czynienia z C?
Lepszy kod:

var s:ansistring;
begin
  setlength(s,251);
  WaszTrudnyCall(...,@s[1],length(s));
  setlength(s,reallength);
0
kAzek napisał(a):

Spróbuj

function POS_GetResponseValue(hRequest: Pointer; const paramName: PAnsiChar; retVal: PAnsiChar; retValLen:LongInt): LongInt; stdcall; external 'test.dll';

i wywołanie:

var
  buf: array [0..250] of Char;
  hRequest: Pointer;
begin
  POS_GetResponseValue(hRequest, PAnsiChar('da'), buf, SizeOf(buf));
end;

Tylko nie wiem co to jest ten hRequest skoro to do czegoś uchwyt to czy to na pewno Pointer? Jak to POSNET_HANDLE jest zadeklarowane w C++ ?

Dzięki za pomoc ;-) Tera działa...

1 użytkowników online, w tym zalogowanych: 0, gości: 1