function createcomobject(const classid: tguid): iunknown;
begin
olecheck(cocreateinstance(classid, nil, clsctx_inproc_server or
clsctx_local_server, iunknown, result));
end;
function cocreateinstance; external ole32 name 'cocreateinstance';
createcomobject-->cocreateinstance-->µù¥Uªíclsid-->loadlibrary
-->dllgetclassobject¡]§Ú̦b«á±¤ÀªR¤¤±N±q³oùض}©l¡^
-->iclassfactory.createinstance
library project3;
uses
comserv,
unit3 in 'unit3.pas',
project3_tlb in 'project3_tlb.pas',
unit7 in 'unit7.pas' {form1};
exports
dllgetclassobject,
dllcanunloadnow,
dllregisterserver,
dllunregisterserver;
{¢Cr *.tlb}
{¢Cr *.res}
begin
end.
function dllgetclassobject(const clsid, iid: tguid; var obj): hresult;
var
factory: tcomobjectfactory;//ª`·N¡G³oùس£¬O¥ÑÃþ¤u¼t´£¨Ñªº¡C
begin
factory := comclassmanager.getfactoryfromclassid(clsid);//1
if factory <> nil then
if factory.getinterface(iid, obj) then//2
{¥ÑÃþ¤u¼t¥h¬d§ä¬ÛÀ³ªºiid¡A¦¨¥\´Nªð¦^s_ok¡A¨Ã¥B±N¤¶±«ü¼Ðªð¦^µ¹obj}
result := s_ok
else
result := e_nointerface{¨S¦³§ä¨ì´Nªð¦^e_nointerface}
else
begin//¦pªG¨S¦³¬ÛÀ³Ãþ¤u¼t
pointer(obj) := nil;//±N¤¶±«ü¼Ð¸mnil
result := class_e_classnotavailable;
end;
end;