Re: ADS - Fullname
Hallo!
Also, ich habe sowohl meine eigene (umständliche) Routine als auch die von Marabu ausprobiert, wohlgemerkt ohne die ADSHelper-Units, und ohne Exceptions zu erhalten. Kann es sein, daß die Funktionen in der Helper-Unit falsch abgebildet werden oder so?
Delphi-Quellcode:
Cu,
function GetUsername(Domain,Kennung:String):String;
var usr: IADSUser; pc:array[0..255] of WideChar; s:String; begin s:='WinNT://'+Domain+'/'+Kennung; StringToWideChar(S,PC,Length(S)+1); ADsGetObject(pc, IADsUser, usr); if not Assigned(usr) then Result := 'Unknown' else Result := usr.FullName; end; function GetUserFullname(Domain, Username: string): string; var usr: IADsUser; ws: WideString; begin ws := 'WinNT://' + Domain + '/' + Username; if ADsGetObject(PWideChar(ws), IID_IADsUser, usr) = S_OK then Result := usr.FullName else Result := 'Unknown'; end; procedure TForm54.BTN_SuchenClick(Sender: TObject); var usr: IADSUser; pc:array[0..255] of WideChar; s:String; begin Edit_Name.Text:=GetUserName(Edit_Domain.Text,Edit_Kennung.Text); Edit_Name2.Text:=GetUserFullName(Edit_Domain.Text,Edit_Kennung.Text); end; Udontknow |
Re: ADS - Fullname
Hmm, jetzt hab ich mir nochmals die Units angeschaut die bei dem Beispiel dabei waren.
Wobei dabei anscheinend adhelper zu adshelp modifiziert wurde (das Datum ist aktueller). Welche hast du bei dem Bsp von marabu verwendet??? Kannst du mal deine Variante (gezippt) von marabu hier reinhängen. Danke MarLe |
Re: ADS - Fullname
Hallo Udontknow,
ich bin nicht der ASM-Insider, weit gefehlt und ich möchte auch nicht deine Erfahrungen mit Interface's in Frage stellen, die wirst du schon haben. Soweit ich weiss hast Du was die Gültigkeit der Interface-Refrenzen betrifft auch Recht. Trozdem weiterlesen;-) Es ging darum, warum eine Exception aus gelöst wird bei der Zuweisung Result := S;.
Delphi-Quellcode:
Sicherlich, und das ist eine Annahme, soll der Rückgabewert zB. einem TEdit.Text, TLabel.Caption usw. übergeben werden.
function TForm2.GetUserFullname(Domain, Username: String): string;
var usr: IADsUser; s: string; begin result := 'Unknown'; ADsGetObject('WinNT://' + Domain + '/' + Username, IADsUser, usr); assert(usr <> nil); s := usr.FullName; result := s; // hier ist die Welt noch in Ordnung end; Wie der CPU-Dump gezeigt hat wird TControl.SetText aufgerufen. Um die ganze Sache genauer zu prüfen habe ich das Nachgestellt. Verwendet habe ich die adshlp.pas vom 20.09.2004.
Delphi-Quellcode:
Bei der Zuweisung von Result := S; kamm es zur Exception, wie bei MarLe.
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, adshlp, ActiveDs_TLB, StdCtrls; type TForm1 = class(TForm) Label1: TLabel; Label2: TLabel; Label3: TLabel; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private-Deklarationen } S : String; function GetFullNameByName(Domain : String; Name : String) : String; procedure FullNameByName(Domain : String; Name : String); public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin Edit3.Text := ''; Edit3.Text := GetFullNameByName(Edit2.Text, Edit1.Text); end; function TForm1.GetFullNameByName(Domain : String; Name : String) : String; var usr : IADsUser; begin ADsGetObject('WinNT://' + Domain + '/' + Name, IADsUser, usr); Assert(usr <> nil); S := usr.FullName; Result := S; end; procedure TForm1.FullNameByName(Domain : String; Name : String); var usr : IADsUser; begin ADsGetObject('WinNT://' + Domain + '/' + Name, IADsUser, usr); Assert(usr <> nil); Edit3.Text := usr.FullName; end; procedure TForm1.Button2Click(Sender: TObject); begin FullNameByName(Edit2.Text, Edit1.Text); end; Daraufhin habe ich das ganze mit OllyDebug durchlaufen lassen und folgende Feststellung gemacht. Wenn TControl.SetText aufgerufen wird und man dorthinein verzweigt, stellt man Fest das ein Aufruf von Tcontrol.GetText erfolgt und die Exception auslöst. Um das Problem zu ergründen habe ich in der Unit Controls nachgesehen, was dort passiert. Es wird mittels Perfom die WM_GETTEXTLENGTH-Message an das, dass Ergebnis erhaltene Control gesenden, um die Textlänge zu ermitteln. Anschließend wird SetString aufgerufen, welche den Inhalt und die Länge des String setzt Zitat:
Alles klar.? Gruss Alter Mann PS Den genauen Grund der Exception konnte ich nicht heraubekommen, wie geschrieben: Ich bin kein ASM-Insider. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:33 Uhr. |
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