Einzelnen Beitrag anzeigen

Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
948 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Interface und Pointer of Pointer

  Alt 19. Nov 2007, 10:13
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ß
Angehängte Dateien
Dateityp: zip ui_685.zip (3,5 KB, 10x aufgerufen)
  Mit Zitat antworten Zitat