Problem z funkcja z C -> Delphi

0

Hej

Mam problem z funkcja z C ktora probuje przeniesc do Delphi

W C funkcja wyglada tak:

//to jest  C
//ULONG __stdcall PokazWynik(char* opis,double* wynik,char* info)

//natomiast w Delphi zrobilem to tak
function PokazWynik(var Opis: PChar; var wynik: double; var info: PChar): integer; stdcall;

Funkcja jest w mojej DLLce ktora robie w delphi lecz kurde nie moge sobie poradzic z przekazaniem odpowiednich wartosci do programu glownego :-( Wszystko sie ladnie kompiluje ale jak sie uruchomi biblioteka to wyskakuja mi w miejscu przeslanych danych jakies dziwne krzaczki :-(

Ogolnie chodzi mi o to zebyscie mi powiedzieli czy to co zrobilem w delphi jest rowne temu z c ;-) Jesli nie to gdzie trzeba co zmienic :-)

A juz w ogole fajnie by bylo jakbyscie mi podpowiedzieli jak przypisac jakas wartosc do tych zmiennych - zakladam ze wybrane przeze mnie typy sa dobre

Sprawa jest niecierpiaca zwloki ;-)

0

Mysle, ze argumenty powinny byc nastepujacych typow (bez var)

Opis: PChar; 
wynik: Pdouble; 
info: PChar

a wywolanie takiej funkcji moze wygladac np. tak:

var
  Opis, info: String;
  Wynik: Double;
begin
  wynik := 10.23;
  Opis := 'To jest opis';
  Info := 'a to info';
  PokazWynik(PChar(Opis), @wynik, PChar(info));
end;
0

polecam programik do konwertowania http://www.astonshell.com/files/c2pas.zip

0

Hmmm chyba cos zle wytlumaczylem

Otoz ta funkcja ma byc w mojej DLLce i ja ma wywolywac program glowny. Przy czym zmienne Opis, Wynik, Info sa zmiennymi poprzez ktore moja dllka ma przekazac informacje do programu glownego.

Czyli reasumujac:

  1. program wywoluje ta procedure z mojej dllki
  2. moja dllka wykonuje procedure
  3. moja dllka przekazuje wyniki do programu glownego poprzez zmienne Opis, Wynik, Info zwracajac rowniez jakis tam wynik
  4. Program glowny wyswietla informacje jakie zostaly przypisane do zmiennych Wynik, Opis, Info

Mam nadzieje ze teraz juz jest ok

c2pas.exe - uzywalem, nie pomoglo :-( W ogole nie przekonwertowalo mi tej deklaracji. Uzylem tez na innym, pelniejszym, programie napisanym w C i w delphi deklaracje zmiennych wyszly takie: {byte} Char *Zmienna - wiec nie dokonca jestem przekonany czy ten soft na pewno dobrze dziala :-(

0

Peyn , wydaje mi sie ze jesli chcesz "odbierac" funkcje w delphi jako
function PokazWynik(var Opis: PChar; var wynik: double; var info: PChar): integer;
to powinienes w c w tej dllce zadeklarowac (no i odpowiednio zmodyfikowac jej cialo) jako
ULONG __stdcall PokazWynik(char &opis,double &wynik,char &info);

bo parametr przekazywany jako var w delphi odpowiada referencji w c - choc nie wiem czy nie ma jakichs dodatkowych problemow z powodu tego ze to dll.

0

Peyn , wydaje mi sie ze jesli chcesz "odbierac" funkcje w delphi jako
function PokazWynik(var Opis: PChar; var wynik: double; var info: PChar): integer;
to powinienes w c w tej dllce

Hmm, cos mi sie zdaje ze mnie nadal nie rozumiecie.

Ja pisze DLL w Delphi (powiedzmy ze to jest swego rodzaju plugin). I w tej mojej DLL ma byc ta funkcja ktora napisalem. Ta funkcje bedzie wywolywal program glowny, ktory najwyrazniej jest pisany w C bo opis funkcji dostalem wlasnie w C.

Program glowny wywola ta funkcje z mojej DLLki i oczekuje ze ta funkcja zwroci mu wyniki w zmiennych Opis, Wynik, Info. Rozumiecie?

Hmm, no chyba ze ja cos nie kumam :-(

0

Ah , sorki, źle zrozumiałem.
W takim razie musisz dopasowac parametry w druga stronę. Jesli mają byc wskaźniki no to wskaźniki.
a wiec na przykald tak:
type preal=^double;
function PokazWynik(Opis: PChar; wynik:preal;info: PChar): integer;
Choc dzialanie tego bedzie zalezne od tego jak te wskazniki beda podawane - podejrzewam ze jako adresy istniejacychw programie zmiennych wtedy zwyczajnie dajesz w fuunkcji pokazwynik wynik^:=costam w przypadku pcharow podobnie.
Nie mam pewnosci czy to zadziala no ale moze warto sprobowac
Pozdrawiam.

0

Moze cos takiego:

function PokazWynik(Opis: PChar; Wynik: PDouble; info: PChar): Integer;stdcall;
begin
{tak bedzie, gdy program, ktory wywola ta funkcje, przydzieli pamiec dla tych zmiennych, jesli nie to uzyj GetMem/New}
  StrCopy(Opis, 'To jest opis z DLL');
  StrCopy(info, 'To jest info z DLL');
  Wynik^ := 10.23;
end;
0

Hmm, zrobilem tak jak pisaliscie (prawde mowiac z tym StrCopy to juz wczesniej tez probowalem tylko ze mi krzaki wychodzily wiec zaniechalem). Niestety nadal jest to samo :-( W miejscu na Opis pojawiaja sie kody a Wynik jest zawsze rowny 0 :-(

StrCopy nie dziala bez wczesniejszego GetMem na zmiennych wiec wnioskuje ze program glowny nie przyporzadkowuje pamieci do tych zmiennych - troche mnie to dziwi bo przeciez wywolujac ta funkcje musi juz miec te zmienne zadeklarowane :-(

W kazdym razie nadal jestem tam gdzie bylem :-( Wracam do szukania jakiegos rozwiazania. Jakbyscie mieli jeszcze jakies pomysly, jakby ktokolwiek mial jakis pomysl, to dajcie znac!

0

Odpowiedz przyszla z pl.comp.lang.delphi

Otoz okazuje sie ze w definicji funkcji przed PChar nie powinno byc var - i to tyle, reszta dziala :D Wartosc do PCharow zapisujemy przez strcopu a do wyniku normalnie przyrownujac. :-D

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