Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.011 c
3-38043
Filat
2003-01-26 17:27
2003.02.13
*.LDF > 2 Гб. Как его уменьшить или очистить?


14-38532
REA
2003-01-29 11:05
2003.02.13
Войны животных


1-38197
Vampire
2003-02-04 09:38
2003.02.13
Поисх файлов


3-38085
Демонов Е.В.
2003-01-27 13:01
2003.02.13
Ворос О BDE


3-38032
Бук
2003-01-29 08:15
2003.02.13
Какую БД взять?




   Наверх