Entwickler-Ecke

Windows API - LNK-Datei in einem Thread verarbeiten


maxk - Di 09.09.03 20:01
Titel: LNK-Datei in einem Thread verarbeiten

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
procedure ReadLink(const ShortCutName:string;var Target,Args,WorkDir,
 Description,Icon:string;var IconNo,ShowCmd:integer;var HotKey:Word);
var IObj:IUnknown;
    Link:IShellLink;
    IPFile:IPersistFile;
    ShortCutNameW:WideString;
    FindData:_Win32_Find_DataA;
    Buffer:array[0..MAX_PATH-1of Char;
begin
 IObj := CreateComObject (CLSID_ShellLink);
 Link := IObj as IShellLink;
 IPFile := IObj as IPersistFile;

 ShortCutNameW:=ShortCutName;
 IPFile.Load(PWChar(ShortCutNameW),0);

 with Link do begin
  GetPath(Buffer,SizeOf(Buffer),FindData,0);
  Target:=StrPas(Buffer);
  GetWorkingDirectory(Buffer,SizeOf(Buffer));
  WorkDir:=StrPas(Buffer);
  GetArguments(Buffer,SizeOf(Buffer));
  Args:=StrPas(Buffer);
  GetDescription(Buffer,SizeOf(Buffer));
  Description:=StrPas(Buffer);
  GetHotkey(HotKey);
  GetShowCmd(ShowCmd);
  GetIconLocation(Buffer,SizeOf(Buffer),IconNo);
  Icon:=StrPas(Buffer);
 end;
end;

Mit diesem Code lese ich Informationen aus LNK-Dateien aus, was auch funktioniert. Erfolgt der Aufruf jedoch aus einem Thread, so erhalte ich eine Exception. "CoInitialize wurde nicht aufgerufen" von "EOleSysError". Beim Aufruf über den MainThread (Application) klappt alles. Was kann ich tun?

Danke


Delete - Di 09.09.03 20:42
Titel: Re: LNK-Datei in einem Thread verarbeiten
maxk hat folgendes geschrieben:
Was kann ich tun?

Hm, mal lesen ...
Zitat:
Erfolgt der Aufruf jedoch aus einem Thread, so erhalte ich eine Exception. "CoInitialize wurde nicht aufgerufen" von "EOleSysError".

:wink: Vielleicht "CoInitialize" (ActiveX-Unit) einmal aufrufen? Am Programmende dann aber "CoUninitialize" nicht vergessen.


Motzi - Di 09.09.03 23:33

Verwendest du in deinem Projekt die Unit Forms? Normalerweise wird ja in der dpr-Datei Application.Initialize aufgerufen, und das wiederum ruft CoInitialize auf. Falls du die Unit Forms und damit das TApplication-Objekt nicht verwendest musst du das eben selbst erledigen...


maxk - Do 11.09.03 18:28

Forms ist eingebunden. Meine Frage aber trotzdem, warum geht es nicht in Threads?