znaczacy > comp.lang.* > comp.lang.delphi.bazy-danych

immo (27.11.2018, 16:14)
Witam,

Tak dla "zabawy" przenosze sobie jeden obiekt z C++Buildera na Delphi.
Laczy sie on z Oracle przez funkcje zawarte w oci.dll.

I ogólnie wszystko dzialalo do momentu przepisania funkcji OCILogon
deklarowanej jako:

//sword OCILogon (OCIEnv *envhp, OCIError *errhp, OCISvcCtx **svchp,
// const OraText *username, ub4 uname_len,
// const OraText *password, ub4 passwd_len,
// const OraText *dbname, ub4 dbname_len);
function OCILogon(
envhp: Pointer;
errhp: Pointer;
var svchp: Pointer;
username: Pointer;
uname_len: ub4;
password: Pointer;
passwd_len: ub4;
dbname: Pointer;
dbname_len: ub4
): sword; cdecl; external WINDOWS_DLL_LOCATION;

Niestety za nic nie chce mi to zadzialac w Delphi, pomimo zew C++Builderze dziala poprawnie. W Delphi jako result dostaje zawsze -1.

Funkcje wywoluje tak:
_retCode := OCILogon(
OCIEnvHP,
OCIErrHP,
OCISrvCHP,
@_otu,
_otuL,
@_otp,
_otpL,
@_otd,
_otdL
);

Gdzie _otu, _otp, _otd to TByteArray
_otuL, _otpL, _otdL to ub4 (czyli LongInt).

OCIEnvHP, OCIErrHP i OCISrvCHP to pointery i pierwsze dwa sa poprawnieustawione przez OCIInitialize i OCIEnvInit.

Czy ktos sie kiedykolwiek bawil w dostep do oracla za pomoca oci.dll?
Nigdzie w necie nie moge znalezc jakichs przykladów uzycia tego. A to co znalazlem, nie mialo zdefiniowanego OCILogon.

Oczywiscie jesli "zabawa" nie przyniesie rezultatu to uzyje ODACa, ale nie o to chodzi :)

pozdrawiam,
Przemek O.
Roman Tyczka (27.11.2018, 21:23)
On Tue, 27 Nov 2018 06:14:46 -0800 (PST), immo wrote:

[..]
> dbname: Pointer;
> dbname_len: ub4
> ): sword; cdecl; external WINDOWS_DLL_LOCATION;


A nie powinno byc moze tak?

function OCILogon(
envhp: Pointer;
errhp: Pointer;
var svchp: Pointer;
const username: Pointer;
uname_len: ub4;
const password: Pointer;
passwd_len: ub4;
const dbname: Pointer;
dbname_len: ub4
): sword; cdecl; external WINDOWS_DLL_LOCATION;

I tez warto sprawdzic stdcall, zdarzalo mi sie stdcall uzywac na dllkach
obcych, gdy cdecl nie dzialalo. Choc glowy nie dam w czym byly pisane, ale
warto sprawdzic.

[..]
> _otdL
> );
> Gdzie _otu, _otp, _otd to TByteArray


z zerem na koncu? Wiem, ze jest len podany, ale moze wewnatrz tej metody
ktos zahardcodowal kopiowanie bufora + 1 bajt null terminatora i jest
wyjscie poza bufor? :-)
immo (29.11.2018, 16:00)
W dniu wtorek, 27 listopada 2018 20:23:34 UTC+1 uzytkownik Roman Tyczka napisal:

> I tez warto sprawdzic stdcall, zdarzalo mi sie stdcall uzywac na dllkach
> obcych, gdy cdecl nie dzialalo. Choc glowy nie dam w czym byly pisane, ale
> warto sprawdzic.


To sprawdzilem na samym poczatku, ale jesli pozostale funkcje sa wywolywane przez cdecl i dzialaja poprawnie to ta raczej tez tak bedzie wywolywana.

> z zerem na koncu? Wiem, ze jest len podany, ale moze wewnatrz tej metody
> ktos zahardcodowal kopiowanie bufora + 1 bajt null terminatora i jest
> wyjscie poza bufor? :-)


Tak - ciag z zerem, dlugosc bez zera - to sprawdzilem pierwsze.

Chyba dam sobie spokój i zastosuje ODACa, bo juz nie mam pomyslu. Bardziej zastanawialem sie czy ktos juz takiego cos robil i ewentualnie moze sie podzielic wiedza, bo widze ze to grzebanie w g... :) Pewno dlatego nie moge znalezc biblioteki naglówków do Delphi...

w kazdym razie dzieki za zainteresowanie.

pozdrawiam,
Przemek O.
Podobne wątki