Thread View: pl.comp.lang.delphi.bazy-danych
4 messages
4 total messages
Started by immo
Tue, 27 Nov 2018 06:14
Delphi i Oracle przez oci.dll
Author: immo
Date: Tue, 27 Nov 2018 06:14
Date: Tue, 27 Nov 2018 06:14
58 lines
1723 bytes
1723 bytes
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.
Re: Delphi i Oracle przez oci.dll
Author: Roman Tyczka
Date: Tue, 27 Nov 2018 20:23
Date: Tue, 27 Nov 2018 20:23
66 lines
1914 bytes
1914 bytes
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
Re: Delphi i Oracle przez oci.dll
Author: immo
Date: Thu, 29 Nov 2018 06:00
Date: Thu, 29 Nov 2018 06:00
31 lines
1298 bytes
1298 bytes
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.
Re: Delphi i Oracle przez oci.dll
Author: goo-mlyny@ciach.
Date: Thu, 04 Apr 2019 13:54
Date: Thu, 04 Apr 2019 13:54
11 lines
521 bytes
521 bytes
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ć.
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