AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ADS - Fullname

Ein Thema von MarLe · begonnen am 24. Jan 2007 · letzter Beitrag vom 2. Feb 2007
Antwort Antwort
Seite 3 von 3     123   
Udontknow

Registriert seit: 17. Jun 2002
223 Beiträge
 
#21

Re: ADS - Fullname

  Alt 2. Feb 2007, 10:55
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:
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;
Cu,
Udontknow
  Mit Zitat antworten Zitat
MarLe

Registriert seit: 13. Jan 2005
83 Beiträge
 
Delphi XE2 Professional
 
#22

Re: ADS - Fullname

  Alt 2. Feb 2007, 11:17
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
  Mit Zitat antworten Zitat
Alter Mann

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

Re: ADS - Fullname

  Alt 2. Feb 2007, 18:38
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:
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;
Sicherlich, und das ist eine Annahme, soll der Rückgabewert zB. einem TEdit.Text, TLabel.Caption usw. übergeben werden.
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:
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;
Bei der Zuweisung von Result := S; kamm es zur Exception, wie bei MarLe.
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:
...S auf einen eindeutigen String zeigt (d.h. dessen Referenzzähler den Wert Eins hat)
Und dabei kommt es zur Exception.

Alles klar.?


Gruss
Alter Mann

PS Den genauen Grund der Exception konnte ich nicht heraubekommen, wie geschrieben: Ich bin kein ASM-Insider.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:20 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