Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.02.13;
Скачать: CL | DM;

Вниз

Не работает CreateOLEObject( WScript.Shell )   Найти похожие ветки 

 
archer ©   (2003-02-03 14:29) [0]

Добрый день!
Имеется код

var
Shell : variant;
begin
Shell := CreateOLEObject("WScript.Shell");


Он нормально работает в обычной программе, но как только я помещаю его в созданный мною поток или в другую программу, которую запускаю через CreateProcess, то выдается сообщение "Класс не зарегистрирован."

Как быть?


 
asmith   (2003-02-03 18:03) [1]

Для использования сервисов СОМ в каждом созданном потоке нужно инициализировать среду. Цитата из MSDN:
You need to initialize the COM library on a thread before you call any of the library functions except CoGetMalloc, to get a pointer to the standard allocator, and the memory allocation functions.



 
archer ©   (2003-02-03 18:31) [2]

Я в COM не силен, использую его только для упрощения ;) Но дома у меня все заработало без каких-либо изменений. Народ, подскажите где копать.
И еще дома у меня проставлен VS .Net, поэтому вроде при экспорте type library файл получается подробнее, чем при экспорте на работе. Может это как-то влиять. Что бы было все понятно привожу полный текст


TEnvironment = class
private
FShell: WshShell;
FNetwork: WshNetwork;
FFso: FileSystemObject;
FUserName, FComputerName, FRunFolder, FTempFolder, FMyDocuments: string;
public
property Shell: WshShell read FShell;
property Network: WshNetwork read FNetwork;
property Fso: FileSystemObject read FFso;

property UserName: string read FUserName;
property ComputerName: string read FComputerName;
property RunFolder: string read FRunFolder;
property TempFolder: string read FTempFolder;
property MyDocuments: string read FMyDocuments;

constructor Create;
end;

implementation

constructor TEnvironment.Create;
var
md : OleVariant;
begin
FShell := CoWshShell.Create;
FNetwork := CoWshNetwork.Create;
FFso := CoFileSystemObject.Create;

FUserName := FNetwork.UserName;
FComputerName := FNetwork.ComputerName;
FRunFolder := ExtractFilePath(Application.ExeName);
md := "MyDocuments";
FMyDocuments := FShell.SpecialFolders.Item(md);
FTempFolder := FFso.GetSpecialFolder(2).Path;
end;


 
archer ©   (2003-02-03 20:55) [3]

Вобщем asmith был прав. Но я не понял почему дочернему процессу тоже потребовалась инициализация. Почему Delphi берет это на себя, если запускать программу "с нуля" и не берет, когда программа запускается как дочерний процесс? А если я не знаю как моя программа будет использоваться на месте, то что делать?


 
asmith   (2003-02-04 13:02) [4]

Дельфи берет это на себя только для основного потока и делаем это при инициализации приложения (см. *.dpr файл). Для всех вторичных потоков нужна явная инициализация - так устроены винды.



Страницы: 1 вся ветка

Текущий архив: 2003.02.13;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.012 c
1-38315
harismatik
2003-02-03 13:14
2003.02.13
Выделение в ListView


9-38003
Stucker
2002-09-01 12:26
2003.02.13
Типа голосование (DirectX and OpenGL)


9-38001
Sewix
2002-09-11 08:00
2003.02.13
как убить все спрайты


7-38600
-Alex-
2002-12-10 19:41
2003.02.13
Как узнать о смене картинки рабочего стола.


1-38235
Tundra
2003-02-05 10:57
2003.02.13
Нужно создать прогу - наблюдатель.