Как указывает DavidH, CoNitialize должен быть вызван в вызывающей нити.
Точка наблюдения в связи с основным потоком приложения VCL заключается в том, что независимо от того, использует ли приложение VCL CoInitialize, зависит ли он от модуля ComObj: если он вызывает CoInitialize, вызывается через TApplication.Initialize и подпрограмма InitComObj в ComObj; Если это не так, вы должны должен сам позвонить (или CoInitializeEx).
Простой способ протестировать это - вызвать DLL из консольного приложения без TApplication - это позволит избежать того, что ComObj будет введен в заблуждение, если вы используете какой-то другой, чем ваш основной блок.
Предположим, у вас есть DLL, которая содержит следующую процедуру: экспортируемого
procedure CreateWordDoc;
var
DocText : String;
MSWord,
Document : OleVariant;
begin
MSWord := CreateOleObject('Word.Application');
MSWord.Visible := True;
Document := MSWord.Documents.Add;
DocText := 'Hello Word!';
MSWord.Selection.TypeText(DocText);
end;
, то вы могли бы назвать это так:
program WordCaller;
{$APPTYPE CONSOLE}
uses
SysUtils, Windows, ActiveX;
type
TWordProc = procedure;
var
LibHandle : THandle;
WordProc : TWordProc;
begin
CoInitialize(Nil);
LibHandle := LoadLibrary('WordDll.Dll');
try
if LibHandle <> 0 then begin
try
WordProc := GetProcAddress(LibHandle, 'CreateWordDoc');
if Assigned(WordProc) then
WordProc;
finally
FreeLibrary(LibHandle);
end;
end;
finally
CoUnInitialize;
Readln;
end;
end.
Уточнитните "аварии". MCVE тоже было бы неплохо. – kobik