Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Delphi i Oracle przez oci.dll

47 views
Skip to first unread message

immo

unread,
Nov 27, 2018, 9:14:47 AM11/27/18
to
Witam,

Tak dla "zabawy" przenoszę sobie jeden obiekt z C++Buildera na Delphi.
Łączy się on z Oracle przez funkcje zawarte w oci.dll.

I ogólnie wszystko działało 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 zadziałać w Delphi, pomimo że w C++Builderze działa poprawnie. W Delphi jako result dostaję zawsze -1.

Funkcję wywołuję 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 są poprawnie ustawione przez OCIInitialize i OCIEnvInit.

Czy ktoś się kiedykolwiek bawił w dostęp do oracla za pomocą oci.dll?
Nigdzie w necie nie mogę znaleźć jakichś przykładów użycia tego. A to co znalazłem, nie miało zdefiniowanego OCILogon.

Oczywiście jeśli "zabawa" nie przyniesie rezultatu to użyję ODACa, ale nie o to chodzi :)

pozdrawiam,
Przemek O.

Roman Tyczka

unread,
Nov 27, 2018, 2:23:34 PM11/27/18
to
On Tue, 27 Nov 2018 06:14:46 -0800 (PST), immo wrote:

> Tak dla "zabawy" przenoszę sobie jeden obiekt z C++Buildera na Delphi.
> Łączy się on z Oracle przez funkcje zawarte w oci.dll.
>
> I ogólnie wszystko działało 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;

A nie powinno być może 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 też warto sprawdzić stdcall, zdarzało mi się stdcall używać na dllkach
obcych, gdy cdecl nie działało. Choć głowy nie dam w czym były pisane, ale
warto sprawdzić.

> Niestety za nic nie chce mi to zadziałać w Delphi, pomimo że w C++Builderze działa poprawnie. W Delphi jako result dostaję zawsze -1.
>
> Funkcję wywołuję tak:
> _retCode := OCILogon(
> OCIEnvHP,
> OCIErrHP,
> OCISrvCHP,
> @_otu,
> _otuL,
> @_otp,
> _otpL,
> @_otd,
> _otdL
> );
>
> Gdzie _otu, _otp, _otd to TByteArray

z zerem na końcu? Wiem, że jest len podany, ale może wewnątrz tej metody
ktoś zahardcodował kopiowanie bufora + 1 bajt null terminatora i jest
wyjście poza bufor? :-)


--
pozdrawiam
Roman Tyczka

immo

unread,
Nov 29, 2018, 9:00:05 AM11/29/18
to
W dniu wtorek, 27 listopada 2018 20:23:34 UTC+1 użytkownik Roman Tyczka napisał:

> I też warto sprawdzić stdcall, zdarzało mi się stdcall używać na dllkach
> obcych, gdy cdecl nie działało. Choć głowy nie dam w czym były pisane, ale
> warto sprawdzić.

To sprawdziłem na samym początku, ale jeśli pozostałe funkcje są wywoływane przez cdecl i działają poprawnie to ta raczej też tak będzie wywoływana.

> z zerem na końcu? Wiem, że jest len podany, ale może wewnątrz tej metody
> ktoś zahardcodował kopiowanie bufora + 1 bajt null terminatora i jest
> wyjście poza bufor? :-)

Tak - ciąg z zerem, długość bez zera - to sprawdziłem pierwsze.

Chyba dam sobie spokój i zastosuje ODACa, bo już nie mam pomysłu. Bardziej zastanawiałem się czy ktoś już takiego coś robił i ewentualnie może się podzielić wiedzą, bo widzę że to grzebanie w g... :) Pewno dlatego nie mogę znaleźć biblioteki nagłówków do Delphi...

w każdym razie dzięki za zainteresowanie.

pozdrawiam,
Przemek O.

goo-...@ciach.net

unread,
Apr 4, 2019, 4:54:54 PM4/4/19
to
W dniu wtorek, 27 listopada 2018 15:14:47 UTC+1 użytkownik immo napisał:
> Witam,
>
> Tak dla "zabawy" przenoszę sobie jeden obiekt z C++Buildera na Delphi.
> Łączy się on z Oracle przez funkcje zawarte w oci.dll.
Nie wiem, czy to nadal ciekawe - ale w źródłach FreePascala jest użyta ta funkcja. Z ciekawości skompilowałem zawarty tam przykład - i działa :)
A przejście z FreePascala do Delphi powinno dać się zrobić.
0 new messages