Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

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 11:40


Wenn of object, dann knallts!!!
 
Hallo, ich habe folgende Funktion:

Delphi-Quellcode:
  type
    TGetLdapDomain = procedure(ldap: string) of object;
Delphi-Quellcode:
procedure GetLDAPDomains(CallBack: TGetLdapDomain);
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);
    CallBack(ADsItem.ADsPath);
    //ADsItem.Class_;
  end;
  //if Enum <> nil then
   // hr := ADsFreeEnumerator(Enum);
  VariantClear(varArr);
end;
Wenn nun die CallBackFunktion of object ist, dann knallts... Wenn die CallBackFunktion nicht of Object mache, knallts nicht. Aber ich muss Sie of object machen, da sie zu einer Klasse gehören soll...

(mit knallt es meine ich eine Access Violation)

Ein weiteres Phänomen ist, wenn ich hr := ADsFreeEnumerator(Enum) wieder in den Code aufnehme, dann knallts so oder so...

An was kanns liegen? Testet doch die Procedur mal bei euch....

Danke schon mal im Voraus.
PS: Guten Appetit.

mkinzler 12. Nov 2009 11:44

Re: Wenn of object, dann knallts!!!
 
Meinst du vielleicht TObject?

himitsu 12. Nov 2009 11:47

Re: Wenn of object, dann knallts!!!
 
Wie rufst du denn GetLDAPDomains auf, bzw. wie ist die dort angegebene Prozedur definiert?

cherry 12. Nov 2009 12:26

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

Zitat von himitsu
Wie rufst du denn GetLDAPDomains auf, bzw. wie ist die dort angegebene Prozedur definiert?

Delphi-Quellcode:
procedure TForm1.getLdapDomain(domain: string);
begin
  showMessage(domain);
end;

...

GetLDAPDomains(getLdapDomain);
die Message erscheint zwar noch korrekt, anschliessend gibts aber dann ne Access Violation...

Teekeks 12. Nov 2009 12:50

Re: Wenn of object, dann knallts!!!
 
Müsstest du nicht erst ne Zuweisung machen?
Und: Wie soll die denn zu ner Klasse gehören?
Ich blicke bei deinem Problem nicht ganz durch ^^

cherry 12. Nov 2009 12:59

Re: Wenn of object, dann knallts!!!
 
Probiert doch die Funktion einfach mal aus, dann seht ihr schon was ich meine... Ich kanns selber fast nicht erklären...

Wenn ich z.B

statt
Delphi-Quellcode:
procedure TForm1.getLdapDomain(domain: string);
begin
  showMessage(domain);
end;
dies mache:
Delphi-Quellcode:
procedure TForm1.getLdapDomain(domain: string);
begin
  myList.Add(domain);
end;
dann gehts auch, sobald ich aber dann auf die myList zugreiffen will, gibts ne böse Access Violation und ich weiss nicht woher die kommt!!!!

mleyen 12. Nov 2009 13:05

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

Zitat von cherry
Delphi-Quellcode:
procedure TForm1.getLdapDomain(domain: string);
begin
  myList.Add(domain);
end;

Wie war das bei Callbacks? Man darf nicht auf private/objektspeziefische Sachen zugreifen? (Ich mein da was im Hinterkopf zu haben, arbeite damit aber zu wenig)

Naja, lass mal das "TForm1." weg und probier es dann nochmal mit globalen variablen.

cherry 12. Nov 2009 13:14

Re: Wenn of object, dann knallts!!!
 
Hmm... ist komisch. Ja es geht wenn die myList nicht TForm gehört, wie greiffe ich dann aber von einem andern Formular darauf zu?

Und das mit der CallBackFunction habe ich nur gemacht, weil es anders auch nicht geht. Die Procedure scheint nur dann keine Zugriffsverletzung zu geben, wenn ich keine listen oder variablen abfülle, die eben einer Klasse z.B. TForm1 angehören, egal ob mit Rückgabewert, var Patameter, Parameter oder eben CallBackFunction... irgendwo scheint etwas ganz Faul zu sein, aber was????

mleyen 12. Nov 2009 13:25

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

Zitat von cherry
Hmm... ist komisch. Ja es geht wenn die myList nicht TForm gehört, wie greiffe ich dann aber von einem andern Formular darauf zu?

Die Frage hab mich mir damals auch gestellt. Nachher kam irgendwas komisches dabei raus. (Ich find das Projekt leider nicht mehr)

Aber stell dir das doch mal so vor: Du versuchst von einem Objekt auf eine private Variable von einem anderem Objekt zuzugreifen. Das geht nicht, nur bei den Callbackfunktionen beanstandet der Kompiler das nicht.

Soweit ich weiß hab ich damals eine globale Property von der Variable die ich in der CllBck-Mthd brauchte erstellt und dieser dann auch noch die Instanz des Objekts mitübergeben. So konnte ich dann in der Callback-Methode über diese Instanz auf die property zugreifen.

edit:
Also bei dir säh das dann so aus:
Delphi-Quellcode:
procedure getLdapDomain(domain: string; const TheForm: TForm1);
begin
  TheForm.myList.Add(domain);
end;
Kannst du ja mal testen. :wink:
Unschön, aber man hat wenigstens keine Unit-globale Variable. (nur den neuen Zugriff auf die eigentlich private Variable)
Eine sauberere Alternative würde mich auch interessieren. :stupid:

Delphianer 12. Nov 2009 13:52

Re: Wenn of object, dann knallts!!!
 
Mal ne böse Frage..

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

Grüße,

Lutz


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:24 Uhr.
Seite 1 von 4  1 23     Letzte »    

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