Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Wenn of object, dann knallts!!! (https://www.delphipraxis.net/143245-wenn-object-dann-knallts.html)

Delphianer 12. Nov 2009 15:45

Re: Wenn of object, dann knallts!!!
 
Sorry, es kracht doch. Abhilfe könnte aber vielleicht die Zeile

CoInitialize(nil);

schaffen.

Lutz

cherry 12. Nov 2009 15:49

Re: Wenn of object, dann knallts!!!
 
Ne, macht ja auch keinen Sinn... soweit ich weiss ist das schon initialisiert wenn on Create aufgerufen wird..
Also ich habs auch getestet, geht nicht.

Ist aber schon krass komisch oder?

Delphianer 12. Nov 2009 16:17

Re: Wenn of object, dann knallts!!!
 
Sind Deine Funktionsprotypen stdcall oder safecall?

Lutz

cherry 12. Nov 2009 16:33

Re: Wenn of object, dann knallts!!!
 
ich verwende die units von agnisoft...
http://www.agnisoft.com/white_papers..._directory.asp

safecall !

x000x 12. Nov 2009 16:53

Re: Wenn of object, dann knallts!!!
 
Moin moin,

versuche doch mal bitte, Result erst nach dem "nil setzen" zu zuweisen, also so:
Delphi-Quellcode:
function GetLDAPDomain: String;
var
  NSContainer  : IADsContainer;
  Enum         : IEnumVariant;
  hr           : HRESULT;
  varArr       : OleVariant;
  lNumElements : ULONG;
  ADsItem      : IADs;
  res          : String;
begin
  res := '';
  NSContainer := nil;
  Enum       := nil;
  try
    if ADsGetObject( 'LDAP:', IID_IADsContainer, NSContainer) = S_OK then
    begin
      hr := ADsBuildEnumerator(NSContainer, Enum);
      while SUCCEEDED(hr) do
      begin
        hr := ADsEnumerateNext(Enum, 1, varArr, lNumElements);
        if (lNumElements<=0) then Break;
        if IDispatch(varArr).QueryInterface(IID_IADs, ADsItem) = S_OK then
          res := res + ADsItem.ADsPath + #13;
      end;
    end;
  finally
    Enum       := nil;
    NSContainer := nil;
    Result := res;
  end;
end;

Delphianer 12. Nov 2009 17:58

Re: Wenn of object, dann knallts!!!
 
Langsam gehen mir die Ideen aus.

Bei Kosch habe ich einen abweichenden Funktionsprototypen gefunden:

Delphi-Quellcode:
function ADsGetObject(lpszPathName: PWideChar; const riid: TGUID; out ppObject): HRESULT; Safecall;
Und dann noch diesen Artikel:

http://www.mail-archive.com/delphi@d.../msg14930.html

Ob das allerdings auch für Delphi2009 gilt?

Lutz

cherry 12. Nov 2009 19:10

Re: Wenn of object, dann knallts!!!
 
dann bin ich ja wohl nicht der einzige mit diesem Problem. Hehe.
Danke euch beiden. Ich habe jetzt Wochenende und Zuhause hab ich leider weder D2009 noch meine Projektdaten, also kann ich wohl oder übel die Test erst nächsten Montag durchführen.

Ich melde mich dann mit neuigkeiten, hats bei euch geklappt?

lg und schönes Wochenende...
#enemyleft

cherry 16. Nov 2009 13:03

Re: Wenn of object, dann knallts!!!
 
@x000x, @Delphianer

Das funktionert leider alles nichts, das Ergebnis ist immer dasselbe!
Bringts denn niemand zum laufen?

@x000x: Witzig ist ja, dass ich am Ende z.B. schreiben kann result := 'test'; und es passiert immer noch dasselbe Problem...

Was ist hier bloss faul?

Na, bringst Du es zum laufen? ;-)

EDIT:// Ich bin echt am Ende meiner Nerven! Wenn ich das ganze nicht im FormCreate oder FormShow der MainForm habe, sondern in FormCreate einer anderen Form, dann klappts ohne Einwände. Nur wenn ich AdsFreeEnumerator Verwenden will tritt dann der Fehler noch auf. Ich schiebs jetzt mal auf Microsoft ab und begnüge mich mit dem Workaround. Obwohl ich damit eigentlich nicht ganz glücklich bin.

Wenn also noch jemand eine Idee hat, bin ich immer noch sehr dankbar dafür. Habe übrigens im Internet viele ähnliche Threads gefunden, nur gelöst wurde er noch nie!

ele 21. Mai 2012 17:59

AW: Wenn of object, dann knallts!!!
 
Hallo,

Entschuldigung wenn ich hier einen alten Thread aufwärme...

Aber ich hatte eben das selbe Problem und ich glaube eine Lösung gefunden zu haben.

Das Problem lag an der Deklaration der Funktion ADsGetObject():

Delphi-Quellcode:
function ADsGetObject(lpszPathName:WideString; const riid:TGUID;
                      out ppObject):HRESULT; safecall; external 'activeds.dll';
Nach langem debuggen und pröbeln habe ich die deklaration abgeändert und siehe da: Keine AV mehr.

Delphi-Quellcode:
function ADsGetObject(lpszPathName:WideString; const riid:TGUID;
                      out ppObject):HRESULT; stdcall; external 'activeds.dll';
stdcall ist das Schlüsselwort.

Ich hoffe es hilft, auch wenn der Threaderzeuger schon längs nicht mehr an diesem Projekt arbeiten sollte...

Aphton 21. Mai 2012 18:25

AW: Wenn of object, dann knallts!!!
 
Mal zurück zur ersten Codeversion: Wie rufst du diese Funktion auf?
Zeig mir die Zeile!

Edit:
Och...
Klar -.-'
Bei Stdcall werden alle Parameter verkehrt herum auf den Stack gepusht, wohingegen bei der anderen Variante Register verwendet werden. Kehrt ADsGetObject zurück und beendet mit Ret X so poppt es wertvolle Register vom Stack, die es nicht darf (per SafeCall Deklaration), jedoch trotzdem tut (weil StdCall). Dadurch kommt es zu Problemen mit der Rücksprungsadresse die vor jeder Unterroutinenaufruf (SubProgramCall) auf den Stack gepusht wird...
Ach ach...


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:17 Uhr.
Seite 3 von 4     123 4      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz