Super, genau das habe ich gewollt.
Nun möchte ich aber als Rückgabewert keine TStringList sondern ein Mehrdimensionales Dynamisches Array...
Ich hab das mal so gemacht:
Delphi-Quellcode:
type
TItemArray = array of array of String;
Delphi-Quellcode:
function DirectorySearch(ADsPath: String; Properties : Array of PWideChar; SearchText : String; Category : String) : TItemArray; stdcall;
function Included(str1, str2 : String) : boolean;
var
s1, s2 : String;
begin
s1 := UpperCase(Str1);
s2 := UpperCase(Str2);
Result := POS(s1, s2) <> 0;
end;
var
Search : IDirectorySearch;
ptrResult : THandle;
col : ads_search_column;
hr : HResult;
opt : ads_searchpref_info;
dwCount : DWORD;
dwErr : DWord;
szErr : array[0..255] of WideChar;
szName : array[0..255] of WideChar;
i,idx : Integer;
found, empty : Boolean;
begin
if SUCCEEDED(ADsGetObject(ADsPath, IDirectorySearch, Search)) then
begin
try
opt.dwSearchPref := ADS_SEARCHPREF_SEARCH_SCOPE;
opt.vValue.dwType := ADSTYPE_INTEGER;
opt.vValue.__MIDL_0010.Integer := ADS_SCOPE_SUBTREE;
if not SUCCEEDED(search.SetSearchPreference(opt, 1)) then
begin
ADsGetLastError(dwErr, @szErr[0], 254, @szName[0], 254);
ShowMessage(WideCharToString(szErr));
Exit;
end;
dwCount := Length(Properties);
hr := search.ExecuteSearch(StringToOleStr('(objectCategory=' + Category + ')'), @Properties[0], dwCount, ptrResult);
found := false;
if SUCCEEDED(hr) then
begin
hr := search.GetNextRow(ptrResult);
i := 0;
while (hr <> S_ADS_NOMORE_ROWS) do
begin
setLength(Items, i+1, dwCount);
empty := true;
for idx := 0 to dwCount -1 do
begin
if Succeeded(search.GetColumn(ptrResult, Properties[idx], col)) then
begin
if col.pADsValues <> nil then
begin
if not found then
begin
found := Included(SearchText, col.pAdsValues^.__MIDL_0010.BackLink.ObjectName);
if found then
begin
Items[i,idx] := col.pAdsValues^.__MIDL_0010.BackLink.ObjectName; {col.pszAttrName + ': ' +}
empty := false;
end;
end
else
begin
Items[i,idx] := col.pAdsValues^.__MIDL_0010.BackLink.ObjectName; {col.pszAttrName + ': ' +}
empty := false;
end;
end;
search.FreeColumn(col);
end;
end;
hr := search.GetNextRow(ptrResult);
found := false;
if not empty then
inc(i);
end;
end;
finally
end;
end;
Result := Items;
end;
Der letzte Array Eintrag ist allerdings immer leer und ich frage mich sowieso, ob dieser Code "schön" ist oder nicht?!
Vielleicht sieht ja jmd gleich eine Verbesserung die gemacht werden könnte?!
- Aber bei mir funktionierts auf jeden fall...
LG Cherry