Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.01 c
14-38559
hatchy
2003-01-26 11:45
2003.02.13
Построение игр штука не простая...


3-38069
dimmu3
2003-01-27 08:33
2003.02.13
ограничение на длинну строки в DBGrid


3-38012
Сергей
2003-01-17 13:32
2003.02.13
Как создать справочник?


3-38059
cranium
2003-01-26 18:54
2003.02.13
DBGrid и DBEdit c кнопкой выбора....


1-38301
Kotka
2003-02-06 00:33
2003.02.13
Инфа о форме





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский