Форум: "Основная";
Текущий архив: 2003.02.13;
Скачать: [xml.tar.bz2];
ВнизНе работает 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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.009 c