Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Interface und Pointer of Pointer (https://www.delphipraxis.net/103650-interface-und-pointer-pointer.html)

Alter Mann 19. Nov 2007 09:13


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:
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;
Laut MSDN ist der out-Parameter ein Pointer of Pointer auf das im zweiten Parameter angeforderte Interface.

Beispiel(ADsHlp):
Code:

//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;
Stellt sich nun für mich die Frage, wie übergebe NSContainer so als Pointer, damit die JwaADsHlp verwendet werden kann?

Gruß

marabu 19. Nov 2007 10:23

Re: Interface und Pointer of Pointer
 
Hallo,

hast du es schon so probiert?

Delphi-Quellcode:
ADsGetObject('LDAP:', IID_IADsContainer, Pointer(NSContainer));
Grüße vom marabu

Alter Mann 19. Nov 2007 12:49

Re: Interface und Pointer of Pointer
 
Danke, das war es.

Dezipaitor 19. Nov 2007 20:16

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