在调用COM函数时,需要初始化oleinitialize(nil)吗?(90分)

  • 主题发起人 主题发起人 mycwcgr_bak
  • 开始时间 开始时间
M

mycwcgr_bak

Unregistered / Unconfirmed
GUEST, unregistred user!
有两段程序,为什么第一段为什么要初始化,而第二段不需要吗?
===============
try
oleinitialize(nil);
anobj:=createcomobject(clsid_shelllink);
shellink:=anobj as ishelllink;
.
.
finally
oleuninitialize;
end;


=======================
unit Project1_TLB;
{$TYPEDADDRESS OFF} // Unit must be compiled without type-checked pointers.
interface
uses Windows, ActiveX, Classes, Graphics, OleServer, OleCtrls, StdVCL;
// *********************************************************************//
// GUIDS declared in the TypeLibrary. Following prefixes are used:
// Type Libraries : LIBID_xxxx
// CoClasses : CLASS_xxxx
// DISPInterfaces : DIID_xxxx
// Non-DISP interfaces: IID_xxxx
// *********************************************************************//
const
// TypeLibrary Major and minor versions
Project1MajorVersion = 1;
Project1MinorVersion = 0;
LIBID_Project1: TGUID = '{2CFD7FCA-6E13-457E-B3BF-17BB90B41E32}';
IID_Icw: TGUID = '{BD32CDE8-A713-47E0-AE9B-EEDAEEF8710F}';
CLASS_cw: TGUID = '{05143E4C-4498-42EB-A975-139F310F0D14}';
type
// *********************************************************************//
// Forward declaration of types defined in TypeLibrary
// *********************************************************************//
Icw = interface;
IcwDisp = dispinterface;
// *********************************************************************//
// Declaration of CoClasses defined in Type Library
// (NOTE: Here we map each CoClass to its Default Interface)
// *********************************************************************//
cw = Icw;

// *********************************************************************//
// Interface: Icw
// Flags: (4416) Dual OleAutomation Dispatchable
// GUID: {BD32CDE8-A713-47E0-AE9B-EEDAEEF8710F}
// *********************************************************************//
Icw = interface(IDispatch)
['{BD32CDE8-A713-47E0-AE9B-EEDAEEF8710F}']
procedure my(aa: OleVariant);
safecall;
end;

// *********************************************************************//
// DispIntf: IcwDisp
// Flags: (4416) Dual OleAutomation Dispatchable
// GUID: {BD32CDE8-A713-47E0-AE9B-EEDAEEF8710F}
// *********************************************************************//
IcwDisp = dispinterface
['{BD32CDE8-A713-47E0-AE9B-EEDAEEF8710F}']
procedure my(aa: OleVariant);
dispid 1;
end;

// *********************************************************************//
// The Class Cocw provides a Create and CreateRemote method to
// create instances of the default interface Icw exposed by
// the CoClass cw. The functions are intended to be used by
// clients wishing to automate the CoClass objects exposed by the
// server of this typelibrary.
// *********************************************************************//
Cocw = class
class function Create: Icw;
class function CreateRemote(const MachineName: string): Icw;
end;

implementation
uses ComObj;
class function Cocw.Create: Icw;
begin
Result := CreateComObject(CLASS_cw) as Icw;
end;

class function Cocw.CreateRemote(const MachineName: string): Icw;
begin
Result := CreateRemoteComObject(MachineName, CLASS_cw) as Icw;
end;

end.
 
>>在调用COM函数时,需要初始化oleinitialize(nil)吗?
此问题没有统一的答案。是否需要初始化,需要看你的环境。调用oleinitialize的基本
原则:所有线程如果要使用ActiveX/OLE的函数,对象,都需要调用初始化以提供COM运行
的环境。所以看一段代码有没有调用oleinitialize主要看它所处的环境(Context).我们在
调用COM对象的时候没有调用oleinitialize,是因为Delphi已经在初始化主线程时调用了。
 
TO LLLYJ
我在第二段例子中,DELPHI并没有在主线程中调用oleinitialize呀
 
只有在线程中创建远程自动化对象时才用oleinitialize.
 
comobj这个单元当中已经包含了COM库的初始化函数(就是你说的那个).所以如果包含了COMOBJ单元就应该不用.
 
看错了.
CoInitialize是必须调用的,而您所说的那个oleinitialize则是如果组件程序是一个ole对象的
的时候才调用的.
后者多出一个功能就是初始化OLE界面.
oleinitialize也会由DELPHI自动为你调用.自己不用调用.
 
Delphi在Application里自动为你调用oleinitialize
所以一般来说你是不用手工调用oleinitialize的。
 
多人接受答案了。
 
后退
顶部