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.