![]() |
Interface und Pointer of Pointer
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
bin gerade dabei ein bestehendes Mini-Programm auf die Jedi-Units um zu stellen. Bestandteil des Programms ist ein ADs-Treeview. Bisher habe ich die ADsHlp-Unit von agnisoft verwendet. Bei der Umstellung auf JwaADsHlp kommt es jedoch zur der Fehlermeldung: ‚Die Typen der tatsächlichen und formalen Parameter müssen übereinstimmen’. Woran liegt es; Die Function ADsGetObject ist unterschiedlich deklariert:
Code:
Laut MSDN ist der out-Parameter ein Pointer of Pointer auf das im zweiten Parameter angeforderte Interface.
ADsHlp
function ADsGetObject(lpszPathName:WideString; const riid:TGUID; out ppObject):HRESULT; safecall; JwaADsHlp function ADsGetObject(lpszPathName: LPCWSTR; const riid: TGUID; out ppObject: Pointer): HRESULT; stdcall; Beispiel(ADsHlp):
Code:
Stellt sich nun für mich die Frage, wie übergebe NSContainer so als Pointer, damit die JwaADsHlp verwendet werden kann?//Hilfsklasse für Treeview type PNodeData = ^TNodeData; TNodeData = class(TObject) private FName : String; FClassName: String; FFullPath : String; procedure SetName(Value : String); public property Name : String read FName write SetName; property CName : String read FClassName write FClassName; property FullPath : String read FFullPath; end; procedure TNodeData.SetName(Value : String); begin FName := Copy(Value, 8, Length(Value)); FFullPath := Value; end; procedure TADsTreeDialog.GetLDAPDomain; var NSContainer : IADsContainer; Enum : IEnumVariant; hr : integer; varArr : OleVariant; lNumElements : ULONG; item : IADs; s : String; RN : TTreeNode; begin tvADs.Items.Clear; NSContainer := nil; Enum := nil; RN := tvADs.Items.Add(nil, 'Active Directory'); RN.ImageIndex := 0; ADsGetObject( 'LDAP:', IADsContainer, NSContainer); // <- hier hr := ADsBuildEnumerator(NSContainer,Enum); while SUCCEEDED(hr) do begin hr := ADsEnumerateNext(Enum, 1, varArr, lNumElements); if (lNumElements<=0) then Break; IDispatch(varArr).QueryInterface(IADs, item); s := item.ADsPath; LRoot := tvADs.Items.AddChild(RN, s); LRoot.Data := TNodeData.Create; TNodeData(LRoot.Data).Name := Item.ADsPath; TNodeData(LRoot.Data).CName := Item.Class_; LRoot.ImageIndex := 1; LRoot.SelectedIndex := 1; end; end; Gruß |
Re: Interface und Pointer of Pointer
Hallo,
hast du es schon so probiert?
Delphi-Quellcode:
Grüße vom marabu
ADsGetObject('LDAP:', IID_IADsContainer, Pointer(NSContainer));
|
Re: Interface und Pointer of Pointer
Danke, das war es.
|
Re: Interface und Pointer of Pointer
Die JEDI API verwendet so gut wie immer einen Typ, um die Typsicherheit von Delphi aufrechtzuerhalten.
Zudem versucht sie so nahe, wie möglich an den C-Header Dateien sich zu orientieren. Verwendest du die neue JEDI API? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz