Главная страница
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
14-38454
Supreme
2003-01-29 20:12
2003.02.13
Можно ли повысить качество записи с обычной видеокамеры?


1-38369
Natalia
2003-02-03 23:32
2003.02.13
Поиск файла


1-38178
ST
2003-02-04 18:38
2003.02.13
Длинные циклы


1-38259
Ihtiandr
2003-02-05 13:18
2003.02.13
Hint Combobox


1-38253
aspen
2003-02-05 14:56
2003.02.13
как корректно зарегистрировать свое расширение?