Delphi-PRAXiS
Seite 2 von 4     12 34      

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)

cherry 12. Nov 2009 13:56

Re: Wenn of object, dann knallts!!!
 
Zitat:

Zitat von Delphianer
Mal ne böse Frage..

Existiert das Objekt eigentlich, zu dem die Callback-Methode gehört?

Grüße,

Lutz


Ja, TForm1.

Delphianer 12. Nov 2009 14:00

Re: Wenn of object, dann knallts!!!
 
Ich kann mir es zwar nicht richtig vorstellen, aber spielt Dir die Referenzzählung von ADsItem vielleicht einen Streich? Kannst Du mal einen stinknormalen String an Deine Callback übergeben?

Lutz

Delphianer 12. Nov 2009 14:02

Re: Wenn of object, dann knallts!!!
 
Gleich nochmal ich. Besser noch, mal alles auskommentieren und nur die Callback mit einem String aufrufen.

Lutz

cherry 12. Nov 2009 14:04

Re: Wenn of object, dann knallts!!!
 
Zitat:

Zitat von Delphianer
Ich kann mir es zwar nicht richtig vorstellen, aber spielt Dir die Referenzzählung von ADsItem vielleicht einen Streich? Kannst Du mal einen stinknormalen String an Deine Callback übergeben?

Lutz

So irgendwas verflixtes in der Art muss es sein, aber genau das ist es wahrscheinlich nicht. Hab mal die CBF so ausgeführt: CallBack('test'); -> selbes Problem

Delphianer 12. Nov 2009 14:14

Re: Wenn of object, dann knallts!!!
 
Kannst Du mal den Aufruf für

GetLDAPDomains

posten?

Lutz

cherry 12. Nov 2009 14:22

Re: Wenn of object, dann knallts!!!
 
Das habe ich doch schon?!.. wie ich aber sehe, konzentriert ihr euch zu fest auf die Thematik Callback... Das Problem tritt aber auch anders auf,
deshalb habe ich die Methode jetzt umgeschrieben:

Also nochmals von vorne... Ich habe diese Funktion:

Delphi-Quellcode:
function GetLDAPDomain: String;
var
  NSContainer  : IADsContainer;
  Enum         : IEnumVariant;
  hr           : integer;
  varArr       : OleVariant;
  lNumElements : ULONG;
  ADsItem      : IADs;
begin
  NSContainer := nil;
  Enum       := nil;
  ADsGetObject( 'LDAP:', IID_IADsContainer, NSContainer);
  hr := ADsBuildEnumerator(NSContainer, Enum);
  while SUCCEEDED(hr) do
  begin
    hr := ADsEnumerateNext(Enum, 1, varArr, lNumElements);
    if (lNumElements<=0) then Break;
    IDispatch(varArr).QueryInterface(IID_IADs, ADsItem);
    result := result + ADsItem.ADsPath + #13;
    //ADsItem.Class_;
  end;
end;
Wenn ich im Programm z.B. die Funktion so aufrufe:

public {von TForm1}
myVar: String;

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  // es kracht schon so
  myVar := GetLDAPDomain;
end;
Sobald ich myVar direkt in FormCreate deklariere, oder ausserhalb der Klasse TForm, dann gehts... so habe ich aber von anderen Forms keinen Zugriff,,, und überhaupt, wieso sollte das ein Problem sein so wie ich es mache=????

Delphianer 12. Nov 2009 14:57

Re: Wenn of object, dann knallts!!!
 
Dann hast Du uns auf eine falsche Fährte geführt..

Ich sehe eine Reihe von potentiellen Fehlerquellen, die ich gern ausschließen würde:

1. erste Zeile: Result := '';
2. ADsGetObject liefert ein S_OK zurück, bitte auswerten
3. bei den anderen Funktionen bitte auch Rückgabewert auswerten

Lutz

cherry 12. Nov 2009 15:04

Re: Wenn of object, dann knallts!!!
 
Erstmal sorry für die Irreführung...
Hab die Funktion nun ein wenig angepasst:

Delphi-Quellcode:
function GetLDAPDomain: String;
var
  NSContainer  : IADsContainer;
  Enum         : IEnumVariant;
  hr           : integer;
  varArr       : OleVariant;
  lNumElements : ULONG;
  ADsItem      : IADs;
begin
  Result := '';
  NSContainer := nil;
  Enum       := nil;
  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
        result := result + ADsItem.ADsPath + #13;
    end;
  end;
end;
geht trotzdem nicht. Komisch ist ja, dass die Funktion das erwartete Resultat zurückgibt, wenn das result allerdings in eine Variable von einer Klasse gespeichert werden soll, gehts nicht. Bei einer Prozedur Variable klappts ja prima...

ich kreigs nicht raus?!

>> Ich würd auch gerne

Delphi-Quellcode:
  if Enum <> nil then
    hr := ADsFreeEnumerator(Enum);
  VariantClear(varArr);
verwenden, doch dann krachts auch beim speichern in eine Prozedurvariable... ??!?

Delphianer 12. Nov 2009 15:24

Re: Wenn of object, dann knallts!!!
 
Bei mir läuft's ohne Fehler durch. Allerdings ist bei mir lNumElements 0. Damit reduziert sich der Fehler auf die beiden Zeilen
Delphi-Quellcode:
if IDispatch(varArr).QueryInterface(IID_IADs, ADsItem) = S_OK then
        result := result + ADsItem.ADsPath + #13;
Lutz

[edit=mkinzler]Code-Tag durch Delphi-Tag ersetzt Mfg, mkinzler[/edit]

cherry 12. Nov 2009 15:27

Re: Wenn of object, dann knallts!!!
 
Hmmm... Hab mir eine DummyFunktion gebastelt:

Delphi-Quellcode:
function test: String;
var
  NSContainer  : IADsContainer;
begin
  result := 'test';
  NSContainer := nil;
  ADsGetObject( 'LDAP:', IID_IADsContainer, NSContainer);

then
und habe dabei festgestellt: Das Problem existiert auch so!
Du hast es bei dir getestet? -> hast du auch versucht den Rückgabewert in eine public oder private Variable von TForm1 zu speichern? denn da krachts bei mir...


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:54 Uhr.
Seite 2 von 4     12 34      

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