¹C«È:  µù¥U | µn¿ý | ·j¯Á | À°§U | VIPÃÙ§U¥»¯¸ | ¥ZµnÃÙ§U¼s§i | ³]¬°­º­¶ | ¥[¤J¦¬Âà | ÁcÅ餤¤å

 

your gf Ú»­ø¨ì¤ù ¥î¼äóa ¤£¯à³X°ÝSOPCAST­¶­± ¶Â¦â­I´º ¤ÑÀs¤K³¡·tª÷Ä_ ¸Ý¥Ponline©xºô ¤p¤t¬ü ½u¤WH°Êµe §K¶O§Y®É³ø»ù ªá¼Ë¤Ö¦~¤Ö¤k¢ê¢ü ¤Ó»×¥ß§Ó¶Ç ¤H¶¡¤¿¾¹º©µe Hebe·s¾v«¬ Media calssic I miss you³¯¬f¦t seed H LostPlanet¯}¸Ñ ¤Ñ°ó¨pªA³Ü¤ôµ{¦¡ ¤Ñ¥~2 online ¯]®ü®á®³¤p©j¥þ®M

 




·j¯Á¿ï¶µ ¯Á¤Þ¨t²Î¤u¨ãµ¡
 
¼ÐÃD: COM¹ê²{¹Lµ{ (Âà)
http://manyway.net ÃÙ§Uºô¯¸¸ü¤J¤¤...
chan0006
ºaÅA²z¨Æ
Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7
¹q¸£¦a±a°Ï¥D

ºaÅA¾±³¹ ¥Ø«e¨S¦³¾±³¹

UID¡G 460360

©Ê§O¡G ¨k

ºëµØ¡G 3 ½g

¿n¤À¡G 2593 ÂI

©«¤l¡G 1863 ½g

  ¤j ¤¤ ¤p
µoªí©ó 2006-12-7 18:14  ¸ê®Æ  ­Ó¤HªÅ¶¡  ¥D­¶ µu®ø®§  ¥[¬°¦n¤Í  ²K¥[ chan0006 ¬°MSN¦n¤Í ³q¹LMSN©M chan0006 ¥æ½Í QQ

COM¹ê²{¹Lµ{ (Âà) ±z¬O²Ä 713­ÓÂsÄýªÌ

§@ªÌ¡G§d¼C©ú(foxnt)

«e¨¥
COM¤w¸g¦¨¬°¤@­Ó¥²»ÝªºªF¦è¤F¡C¦b§Ú­Ì©P³ò¡A¥i¥H»¡³B³B¥Rº¡¤FCOM - ¦pªG§A¬O¦b¨Ï¥ÎWINDOWS¡A¨Ã¦b¨ä¤U­±½s¼gµ{¦¡ªº¸Ü¡CµM¦Ó¡AµL½×§A¬O¥ÎVC¡AÁÙ¬O¨Ï¥ÎDELPHI¶i¦æCOM½sµ{®É¡A¦b¤j¦h¼Æ±¡ªp¤U¡A½sµ{¤u¨ãªºIDE¤w¸g¦V§AÁôÂäFCOMªº¤j³¡¤À¹ê²{¹Lµ{¡A¨Ï±oµ{¦¡®v®Ú¥»¤£»Ý­nÁA¸ÑCOM¡A¥u±M¤ß­P§Ó¦a¼g¨ä©ÒÃö¤ßªºÅÞ¿è¥N½X¡C³o´N·N¨ýµÛ¡A§Ú­Ì«Ü¤Ö¦³¾÷·|¡A¯à°÷´¦¶}COMªº¯«¯µ­±¯½¡A¨Ó¬Ý¨ì¥¦¤U­±¨ì©³¬O¤°»òªF¦è¡C³o¹ï©ó¤@­ÓWINDOWSµ{¦¡®v¨Ó»¡¡A¤£¯à¤£¬O­Ó¿ò¾Ñ¡C
¦]¦¹¡A¥»¤åªº©v¦®¡A´N¬O©ß¶}²{¦³ªºIDE´£¨Ñªº¦UºØÂQ¾É¤u¨ã¡A¤Þ¾É¤j®a±q³Ì°ò¥»ªº¦a¤è¤J¤â¡A§¹¾ã¦a±q¤@­ÓªÅ¥Õªºµ{¦¡ùØ¡A«Ø¥ß°_¤@­ÓCOMµ{¦¡¡A±q¦Ó¹F¨ì¯à°÷¤ñ¸û²M´·¦aÁA¸Ñ¤@­ÓCOM¡A¨ì©³¬O¦p¦ó¥Í¦¨¥X¨Ó¨Ã¹ê²{¦bµ{¦¡¤¤¡C
¥»¤å°²³]¡A±z¬O¤@­Ó¦³COM½sµ{¸gÅ窺DELPHI/VCµ{¦¡®v¡A¨Ã§Æ±æÁA¸ÑCOMªº°ò¥»¹ê²{¹Lµ{¡C­­©ó½g´T©M®É¶¡¡A§Ú­Ì¥u°Q½×¶iµ{¤ºªºCOM¡]DLL¡^ªº¹ê²{¡A¨Ã¤Þ¾É¤j®a¿Ë¤â«Ø¥ß°_¤@­Ó³Ì²³æªºCOMµ{¦¡¡C

COM¬O¤°»ò¡H
COM¦³¦UºØªí²{§Î¦¡¡A¥i¥H¬O¶iµ{¤º¡A¤]¥i¥H¬O¶iµ{¥~¡F¥i¥H¦b¥»¾÷½Õ¥Î¡A¤]¥i¥H»·ºÝ½Õ¥Î¡C°O±o°ê¥~¦³­Ó¬ã¨sCOMªº²Õ´¡A¥Lªº¥DÃD´N¥s§@¡GCOM´N¬O·R¡I ³o·íµM¬O¥~°ê¤Hªº«ÕÀq¡A¥L¥u¬O·Q»¡©ú¡ACOM¬O­Ó¦h»ò­«­nªºªF¦è¡C¨º»òCOM¨ì©³¬O­Ó¤°»òªF¦è©O¡H
«Ü¦­¥H«e¡A¦b§Ú­è¶}©l¾Ç²ßCOMªº®É­Ô¡A¨­Ãä´N¦³¨Çµ{¦¡®v§i¶D§Ú¡GCOM¤£¬ODLL¡AÁöµM¥¦³q±`¤]¬O¥HDLL¨Ó§@¬°°ÆÀɦWªº¡A¥i¥L§¹¥þ»PDLL§¹¥þ¤£¦P¡C¨º»ò¡A³oºØ»¡ªk¬O§_¥¿½T©O¡H§Ú­Ì¨Ó¬Ý¬Ý¡A­n¹ê²{¤@­Ó¶iµ{¤ºªºCOM¡A¨ì©³»Ý­n¸g¹L­þ¨Ç¨BÆJ¡A¨º»ò¡A§Ú­Ì´N¯à«Ü²M·¡ªºª¾¹Dµª®×¤F¡C
§¹¦¨¤@­Ó¶iµ{¤ºªºCOM¡A³q±`»Ý­n¥H¤U´X¨B¡G
1. «Ø¥ß¤@­ÓDLL¶µ¥Ø¡A¨Ã¾É¥X¥H¤U¥|­Ó¨ç¼Æ¡G
DllGetClassObject,
DllCanUnloadNow,
DllRegisterServer,
DllUnregisterServer;

2. ©w¸q¦Û©w¸qªº¤¶­±¡A¦P®É¥²¶·¹ê²{Iunknown¤¶­±¡C
3. «Ø¥ßGUID¡A¥H¼ÐÃѳo­Ó¤¸¥ó¥H¤Î¦Û©w¸qªº¤¶­±¡C
4. ¦bµù¥Uªí¤¤µù¥U¥H¼Ð°O³o­ÓDLL¡C
¤j®a³£¬Ý¨ì¤F¡A¦b²Ä¤@­Ó¨BÆJùØ¡A»Ý­n«Ø¥ß¤@­ÓDLL±M®×¡A¨º»ò¡A¬O¤£¬O·N¨ýµÛ¡ACOM´N¬O¤@­ÓDLL©O¡H¦b³oùØ¡A§Ú¥i¥H©ú½T¦a§i¶D¤j®a¡A±q§Þ³N¤WÁ¿¡A¤@­Ó¶iµ{¤ºªºCOM§¹¥þ¥i¥H³Q»{¬°´N¬O¤@­Ó´¶³qªºDLL-°ÊºA³s±µ®w¡I¦pªG§A©ß±ó±`¥ÎªºCOM API¡A¤ñ¦pDELPHI¤¤±`¥Îªº¡G
CreateCOMObject()©ÎªÌ
CreateOLEObject()
¨º»ò±z§¹¥þ¥i¥Hª½±µ±Ä¥Î¸ü¤J´¶³qDLLªº¤è¦¡¨Ó½Õ¥Î³o­ÓCOM¤¸¥ó¡A¤ñ¦p»¡¡A±z¥i¥Hª½±µ¥ÎLoadLibrary()¨ç¼Æ¨Ó¸ü¤J³o­ÓDLL¡AµM«á¨Ï¥ÎGetProcAddress¨Ó½Õ¥Î±q³o­ÓDLLùØ¿é¥Xªº¤¶­±¡A±q¦Ó§¹¦¨¦U¶µ¾Þ§@¡C³o¬O§¹¥þ¥i¦æªº¡CµM¦Ó¡A§Ú¤£±o¤£§i¶D¤j®a¡A§â¤@­ÓCOM¶È¶È¬Ý¦¨¤@­ÓDLL¡A¨º¬O«D±`½§²Lªº¬Ýªk - DLL¶È¶È¬O¤@ºØªí²{§Î¦¡¦Ó¤w¡C§ó­«­nªº¬O¡ACOM¹ê²{¤F¤@ºØ³W«h¡C¦]¦¹§Ú­Ì¥i¥H»¡¡G
l COM¬O¤@ºØ¥]§t¤F³\¦h³B²zÅÞ¿è¡B²Å¦X¤F¬YºØ¤¶­±³W½d¡]¦pIunknown³W½d¡^ªºDLL¤¸¥ó¡C
¡]ª`¡G¦pªG¨S¦³¯S§O»¡©ú¡A§Ú¦b¥»¤åùةҫüªºCOM¡A³£¬O«ü¶iµ{¤ºªºDLL§Î¦¡ªºCOM¡^
l COM¹ê²{¤FIunknown¤¶­±¡C¦]¦¹¡A¥ô¦ó¥u­n²Å¦XIunknown³W½d¡A¹ê²{¤FIunknown¤¶­±ªºDLL¤¸¥ó¡A§Ú­Ì³£¥i¥H§â¥L¬Ý¦¨¬O¤@­ÓCOM¡C
¨º»ò¡A¤°»ò¬OIunknown¤¶­±©O¡H¦p¦ó¹ê²{¤@­ÓIunknown¤¶­±©O¡H§Ú­Ì¬Ý¬Ý¡A¦bDELPHI¤¤¬O¦p¦ó©w¸q¤@­ÓIunknown¤¶­±ªº¡G
IInterface = interface
['{00000000-0000-0000-C000-000000000046}']
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
end;
IUnknown = IInterface;

²³æ¤@ÂI¬Ý¡A§Ú­Ìª½±µ³o¼Ë²z¸Ñ´N¦æ¤F¡G
IUnknown = interface
['{00000000-0000-0000-C000-000000000046}']
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
end;
¦bDELPHIùØ¡Ainterface¬O½s;¹©Ò»{ÃѪº¤@ºØÃþ«¬¡C¦pªG¬O¦bVC++¤¤¡AIunknown±N³Q©w¸q¬°¤@ºØµ²ºc¡]struct¡^¡C¦pªG­n¹ê²{¤@­ÓIunknown¤¶­±¡A§Ú­Ì¥²¶·¥Î¤@­ÓÃþ¨Ó¹ê²{¥¦¡A¤ñ¦p¦bDELPHI¤¤¡A­n¹ê²{Iunknown¤¶­±¥i¥H¼g¦¨¬°¡G
TMyCOMObject = class (Tobject, Iunknown)
¡K¡K
end;
¦³¤ßªºÅªªÌ¥i¯à·|¥ß§Y°Ý¡G³o­ÓIunknown¤¶­±¥ÑTobject¨Ó¹ê²{¡A¨º»ò¡A¥i¤£¥i¥H¬O¥Ñ¨ä¥LÃþ¨Ó¹ê²{©O¡H¤ñ¦p»¡¥ÎTcomponentÃþ¨Ó¹ê²{¡Hµª®×¬O¡G §¹¥þ¥i¥H¡I¡I
¨Ò¦p¡A§Ú­Ì­n¹ê²{¤@­Ó¦Û©w¸qªº¤¶­±IMyCOM¡A¥i¥H¼g¦¨³o¼Ë¡G
IMyCOMTest = interface(Iunknown);
TMyCOMTest = class(Tcomponent, IMyCOMTest)
¡K¡K.
End;
³o¼Ë¬O§¹¥þ¥i¥Hªº¡I¦]¬°COMÃöª`ªº¥u¬O¦p¦ó¹ê²{¤@­Ó¤¶­±¡A¦Ü©óµ{¦¡®v¨Ï¥Î¤°»òÃþ¨Ó¹ê²{¡ACOM¬O¤£ºÞªº¡C
«á­±§Ú­Ì­n¹ê²{¤@­ÓCOMªº¨Ò¤l¡A¦Ó¥B§Ú¥´ºâ´N¥Î³o­ÓIMyCOMTest¤¶­±¨Ó°µ¡C©Ò¥H§Ú­Ì§â³o­Ó¤¶­±Án©ú¦¨¬°¨Ò1¡A¥H«K«á­±¨Ï¥Î¡C

COMªº²£¥Í
°²¦p§Ú­Ì¤w¸g§¹¦¨¤F¤@­ÓCOM¡A¨Ã¥B¤w¸g¦b¨t²Î¤¤µù¥U¤F¡C¨º»ò¡A¤@­Ó¥Î¤áºÝ»Ý­n¨Ó½Õ¥Î³o­ÓCOM¡A³o®É¡A¨t²Î¤¤µo¥Í¤F­þ¨Ç¨Æ©O¡H
¤@¯ë¨Ó»¡¡A¥HDELPHI¬°¨Ò¡A«È¤áµ{¦¡¨Ï¥ÎCreateCOMObject©ÎªÌCreateOLEObject½Õ¥ÎCOM¤¸¥ó®É¡A·|µo¥Í¥H¤U´X­Ó¨BÆJ¡G
1. CreateCOMObject©ÎªÌCreateOLEObjectªº°Ê§@¡C
§Ú­Ì¬Ý¬Ý³o¨â­Ó¨ç¼Æ³£·F¤F¨Ç¤°»ò¡G

function CreateComObject(const ClassID: TGUID): IUnknown;
begin
OleCheck(CoCreateInstance(ClassID, nil, CLSCTX_INPROC_SERVER or
CLSCTX_LOCAL_SERVER, IUnknown, Result));
end;

CreateOLEObjectµy·L½ÆÂø¨Ç¡G

function CreateOleObject(const ClassName: string): IDispatch;
var
ClassID: TCLSID;
begin
ClassID := ProgIDToClassID(ClassName);
OleCheck(CoCreateInstance(ClassID, nil, CLSCTX_INPROC_SERVER or
CLSCTX_LOCAL_SERVER, IDispatch, Result));
end;
¬Ý¨ì¤F¶Ü¡HCreateOLEObject¦h¤F¤@­ÓProgIDToClassID¨ç¼Æ¡C³o·N¨ýµÛ¡A¦pªG§Ú­Ì­n¥ÎCreateOLEObject¨Ó½Õ¥Î§Ú­ÌªºCOM¤¸¥ó¡A§Ú­Ì±N­n¦h¤@¨Ç¨BÆJ¨Ó½s¼g§Ú­ÌªºCOM¡C³o­Ó§Ú±N·|¦b«á­±»¡©ú¡C²{¦b¡A§Ú­Ì­nÃöª`ªº¬OCoCreateInstance API¨ç¼Æ¡C
2. CoCreateInstance API¨ç¼Æ±N½Õ¥ÎCoGetClassObject API¡A³o­Ó½Õ¥Î¹Lµ{§Ú­Ì¬O¬Ý¤£¨ì¬ÛÃöªº¥N½Xªº¡A¦]¬°·L³n¤w¸g§â¥L«Ê¸Ë¦n¤F¡C¦ÓCoGetClassObject¨ç¼Æªº§@¥Î¬O¤°»ò©O¡H¥¦±N½Õ¥ÎLoadLibrary¨Ó´M§ä§Ú­Ì«ü©wªºCOM¤¸¥ó¡]DLL¡^¡AµM«á¨Ï¥ÎGetProcAddress ¨Ó´M§ä¤¸¥óªº¤J¤f¨ç¼Æ - ÁÙ°O±o§Ú­Ì¤W­±»¡¹Lªº¨º¥|­Ó³Q¾É¥Xªº¨ç¼Æ¶Ü¡H¹ï¡A¨ä¤¤ªºDllGetClassObject ¨ç¼Æ´N¦b³oùرN³Q½Õ¥Î¡C¸Ó¨ç¼Æªº­ì§Î¦bDELPHI¤¤¬O¡G
function DllGetClassObject(const CLSID, IID: TGUID; var Obj): HResult;
¨ä¤¤²Ä¤T­Ó°Ñ¼Æ¡GObj ¡A±N¦V§Ú­Ìªð¦^COM¤¤ªº©w¸qªº¤¶­±¡C¦ý¬O¡A­nª`·N¡A³o­Ó¤¶­±¨Ã¤£¬O§Ú­Ì¦Û©w¸qªº¤¶­±¡A¦Ó¬O¦V§Ú­Ìªð¦^¤F¤@­Ó³Q¦¨¬°¬O¡§Ãþ¤u¼t¡¨¤¶­±ªºIclassFactoryªº¤¶­±¡C·í§Ú­ÌÀò±oÃþ¤u¼t¤¶­±«á¡A´N¥i¥HÀò±o§Ú­Ì©Ò»Ý­nªº¡B¨º­Ó§Ú­Ì¦Û©w¸qªº¤¶­±¤F¡C¬Ý¬ÝIclassFactory ªº¤¶­±Án©ú¡G
IClassFactory = interface(IUnknown)
['{00000001-0000-0000-C000-000000000046}']
function CreateInstance(const unkOuter: IUnknown; const iid: TIID;
out obj): HResult; stdcall;
function LockServer(fLock: BOOL): HResult; stdcall;
end;
¬Ý¨ì¨º­ÓCreateInstance ªº¤èªk¤F¶Ü¡H¹ï¤F¡A¥¦ªº²Ä¤T­Ó°Ñ¼Æ obj ±N¦V§Ú­Ìªð¦^¨º­Ó§Ú­Ì©w¸qªº¤¶­±¡A¤ñ¦p¬O§Ú­ÌªºIMyCOMTest¤¶­±¡]¨Ò1¡^¡C³o¼Ë¡A§Ú­Ì´N¥i¥H½Õ¥Î§Ú­Ì¦Û©w¸qªº¤¶­±¤èªk¤F¡C
¥H¤Wªº²³¦h¨BÆJ¬Ý°_¨Ó¦³ÂIÅý¤H°g´b¡C¨º»ò§Ú­Ì´N¥Î¤@­Ó²³æªº¬yµ{¨Ó´yø§Ú­Ì­è¤~©Òµo¥Íªº¨BÆJ¡C¤£­n³Q¨º¨Ç¨BÆJÀ~­Ë¡A¨ä¹ê¥L­Ì¬O«D±`²³æªº¡C
l CreateCOMObject --à CoCreateInstance¡C CoCreateInstance ¦bµù¥Uªí¤¤¬d§äCOMªºµù¥U¸ê°T¡C
l CoCreateInstance -à CoGetClassObject ¡Cµù¥U¸ê°T³Q¥æµ¹CoGetClassObject¡C³o®É­ÔCoGetClassObject±Nª¾¹DCOM¤¸¥ó¦bºÏ¤ù¤Wªº¦ì¸m¡C
l CoGetClassObject -à LoadLibrary ¡CLoadLibrary ±N´M§äCOM DLLªº¤J¤f¡AµM«áGetProcAddress½Õ¥Î¨ä¿é¥X¨ç¼ÆDllGetClassObject
l DllGetClassObject ªº¿é¥X°Ñ¼Æ±N¦V§Ú­Ìªð¦^¡§Ãþ¤u¼t¡¨¤¶­±IClassFactory¡C
l IclassFactory --à CreateInstance ¡CCreateInstance¤èªk«Ø¥ß¨ä§Ú­Ì¹ê²{¤¶­±ªºÃþ¡C¸ÓÃþ±N½Õ¥Î¦Û¨­ªºQueryInterface ¤èªk¡A¬d¬Ý¥Î¤á«ü©wªº¤¶­±¬O§_³Q¦Û¤v¹ê²{¡A¦pªG¹ê²{¤F¡A«h¦Vªð¦^¦Û©w¸qªº¤¶­±¡C
l ½Õ¥Îµ²§ô«á¡ACOM«È¤á±N½Õ¥ÎCOMªºDLL¿é¥X¨ç¼ÆDllCanUnloadNow ¡C¦pªG¸Ó¨ç¼Æªð¦^S_OK¡A«hÄÀ©ñ¸Ó¤¸¥ó¡C

¹ê»ÚªºCOM¨Ò¤l
¤U­±§Ú­Ì¨Ó°µ¤@­Ó¹ê»Úªº¨Ò¤l¡C¥]¬A¦p¦ó«Ø¥ß¤@­ÓCOM Server©M¤@­ÓCOM Client¡C
¹ï©óCOM Server¡A§Ú­Ì±N¹ê²{¥H¤U¥\¯à¡G
l ³æ½uµ{¡A³æ«È¤á¤ä´©¡C
l ¹ê²{¦Û©w¸qªº¤¶­±
l ¯à°÷¨Ï¥ÎRegsvr32 ¦b¨t²Î¤¤µù¥U©M¤Ïµù¥U¡C
l ¯à°÷³QDELPHI©ÎªÌVC++µ{¦¡½Õ¥Î¡C
§Ú­Ì¥uÃöª`¹ê²{³Ì°ò¥»ªº¥\¯à¡C·í¤j®a²M·¡¾ã­Ó¬yµ{«á¡A¦ÛµM´N¯à¼g¥X§ó°ª¯Åªº¥\¯à¡A¤ñ¦p¦h½uµ{¤ä´©µ¥¡C
¤U­±¡AÅý§Ú­Ì¶}©lCOM¹ê²{¤§®È¡C


COM Serverµ{¦¡
l ¦bDELPHI¤¤¡A·s«Ø¤@­ÓDLL¤uµ{¡Cª`·N¬ODLL¡A¦Ó¤£¬O Activex Library¡C¨Ã§â¤uµ{¦W«O¦s¬°MyCOM¡CµM«á¨Ì¦¸«Ø¥ß¨â­Ó³æ¤¸ÀÉ¡G
MyCOMServer ³æ¤¸¡G ¦¹³æ¤¸´y­z¤FCOMªºÅÞ¿è¹ê²{
COMDef ³æ¤¸¡G ¦¹³æ¤¸´y­z¤FCOMªº¿é¥X¨ç¼Æ©w¸q¡C
l ¦bMyCOM³æ¤¸ùØ¡A§Ú­Ì©w¸qDLLªº¿é¥X¨ç¼Æ¡A¾ã­Ó¥N½X¡G

library MyCOM;

uses
SysUtils,
Classes,
COMDef,
MyCOMServer in 'MyCOMServer.pas';

//¦b³oùؾɥX¥|­Ó¨ç¼Æ¡C
exports
DllGetClassObject,
DllCanUnloadNow,
DllRegisterServer,
DllUnregisterServer;

{$R *.res}

begin
end.

¥ý°µ¦n©w¸q¡A¤£­n¦Ò¼{¥L­Ì¬O¦p¦ó¹ê²{ªº¡C³o­Ó¦b«á­±§Ú·|°µ¸Ô²Ó¸Ñ»¡¡C¦b³oùاڥý»¡©ú³o¥|­Ó¨ç¼Æªº§@¥Î¡G
DllGetClassObject ¡G ªð¦^Ãþ¤u¼t¤¶­±¡C
DllCanUnloadNow ¡G §i¶D¥Î¤áºÝ¸ÓCOM¬O§_¥i¥H³Q¥¿±`¨ø¸ü¡C
DllRegisterServer ¡G ¦V¨t²Îµù¥UCOM¤¸¥ó¸ê°T¡CRegsvr32.exe ´N¬O½Õ¥Î³o­Ó¨ç¼Æ¨Ó¶i¦æµù¥Uªº¡C
DllUnregisterServer ¡G±q¨t²Î¤¤¤Ïµù¥U¤@­ÓCOM¡CRegsvr32.exe ´N¬O½Õ¥Î³o­Ó¨ç¼Æ¨Ó¶i¦æ¤Ïµù¥Uªº¡C

l ²{¦b¬°§Ú­ÌªºCOM©w¸qGUID¡Cª`·N¡A¦b¤@­ÓCOM¤¸¥óùØ¡A¦³¤TºØGUID¡G
CLASS_xx Ãþ«¬ªºGUID¡A¬O¥Î¨Ó¼ÐÃÑCOM¤¸¥óªº¡C
IID_xxÃþ«¬ªºGUID¡A¬O¥Î¨Ó¼ÐÃѤ@­Ó¤¶­±ªº¡C¥i¥H¦³¦h­Ó¡C
LIBID_xxÃþ«¬ªºGUID¡A¬O¥Î¨Ó¼ÐÃѤ@­ÓTypeLibªº¡CÃö©ó¦p¦ó¹ê²{¤@­ÓTypeLib¡A§Ú·|¦bCOM¹ê²{¹Lµ{¡]2¡^¤¤·|Á¿¨ì¡C¦b³oùØ¥ý²¤¹L¡C
²{¦b¡A§Ú­Ì©w¸q§Ú­ÌªºCOM²Õ¥óªºGUID¡A¦bCOMDef³æ¤¸ùØ¥[¤Jªº¥N½X¬°¡G

const
Class_MyCOM: TGUID = '{CE38847E-A386-4753-89F1-34BE80042107}';
LIBID_MyCOM: TGUID = '{C2387E2A-0F08-442E-8947-D1AB36A9BDD0}';
l ¶}©l©w¸q§Ú­Ìªº¤¶­±¡C§Ú­Ì±Ä¥Î¨Ò¤@©Ò©w¸qªº¤¶­±¡A¦bMyCOMServer³æ¤¸ùØ¥[¤J¥N½X¡G
IMyCOMTest = interface(IUnknown)
['{D1C4A022-7F6F-42F0-A9B0-4A91703EB124}']
function msg: integer;stdcall;
end;
ª`·N¡A¦b³oùØ¡A§Ú­Ì¬°IMyCOMTest ©w¸q¤F¤@­ÓIIDÃþ«¬ªºGUID¡A¥¦°ß¤@ªí¥Ü§Ú­Ìªº¤¶­±¡C¦P®É§Ú­Ì©w¸q¤F¤@­Ó¤èªk msg ¡A¥¦¦V§Ú­Ìªð¦^¤@­Ó¾ã¼Æ­È¡C
©w¸q¤F¤¶­±¡A·íµM­n¹ê²{¥¦¡G
TMyCOMServer = class(TObject, IMyCOMTest)
protected
FLock: integer;
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
public
Constructor Create;
function msg: integer;stdcall;
end;
²{¦b¡A§Ú­Ì¤@­Ó­Óªº¨Ó»¡©ú¨Ã¹ê²{TMyCOMServer ªº´X­Ó¤èªk¡C
_AddRef ¤èªk¡G
¸Ó¤èªk¥Î©ó¼W¥[¤@­ÓCOMªº­p¼Æ¾¹¡C§Ú­Ìª¾¹DCOM Server¬O»Ý­n¤ä´©¦h«È¤á½Õ¥Îªº¡A¦bCOM¤¤¨C¹ê²{¤@¦¸½Õ¥Î¡A´N¥²¶·¶i¦æ­p¼Æ¡C¦pªGCOMªº­p¼Æ>0 ¡A«hCOMÄ~Äò¥Í¦s¡C§_«h¡A¸ÓCOM¤¶­±¹ê¨Ò´N¥²¶·³Qµn¥X¡C
_Release ¤èªk¡G
¸Ó¤èªk©M_AddRef¤èªk¬Û¤Ï¡A¥Î©ó´î¤Ö¤@­Ó­p¼Æ¡A·í­p¼Æ¬°0¡A«hµn¥X¸Ó¤¶­±¡C
QueryInterface ¤èªk¡G
¸Ó¤èªk¥Î©ó¬d¸ß¤@­Ó¤¶­±¬O§_¦s¦b¡A¦pªG¦s¦b«h¦b¿é¥X°Ñ¼Æùتð¦^¸Ó¤¶­±«ü¼Ð¡C
¬°¹ê²{³o´X­Ó¤èªk¡A©Ò²K¥[ªº¥N½X¦p¤U¡G

function TMyCOMServer._AddRef: Integer;
begin
Inc(FLock);
end;

function TMyCOMServer._Release: Integer;
begin
Dec(FLock);
if FLock = 0 then
Free;
end;

function TMyCOMServer.QueryInterface(const IID: TGUID; out Obj): HResult;
begin

//¦bÃþ¤u¼t¤¤¹ê²{ªº¤@­ÓMC¤¶­±¡A¦b³oùتð¦^¡C¥Ñ©ó§Ú­Ì¥u¦³¤@­Ó¤¶­±¡A©Ò¥H¨º­ÓIID°Ñ¼Æ¨S¦³¥Î¡C·íµM¡A¦pªG§Ú­Ì¹ê²{¤F¦h­Ó¤¶­±¡A´N»Ý­nºûÅ@¤@­Ó°}¦C¡A¥Î­ÓCASE»y¥y¡A®Ú¾Ú¤£¦PªºIID¡A¨Óªð¦^¤£¦Pªº¤¶­±¡C
Pointer(Obj) := Pointer(MC);
Result := S_OK;
end;

¨ä¤¤¡AMC¬O¤@­ÓIMyCOMTest ¤¶­±¡A¬O­ÓÁ`ÅéÅܼơG
var
MC: IMyCOMTest;
CF: IClassFactory;

§O§Ñ¤FÁÙ¦³§Ú­Ìªººc³y¾¹¡G
constructor TMyCOMServer.Create;
begin
Inc(FLock);
end;
¦b¤@¶}©l´N¼W¥[¤@­Ó¤Þ¥Î­p¼Æ¡A¨Ï±oCOM­p¼Æ¤j©ó1¡A³o¼ËCOM´N¤£·|¦Û°Ê¾P·´¡C

µM«á¥h¹ê²{§Ú­Ìªº¤¶­±¤èªk¡G
function TMyCOMServer.msg: integer;
begin
result := 1978;
end;
¸Ó¤èªkª½±µ¦V§Ú­Ìªð¦^¤@­Ó¾ã¼Æ­È¡C
l Ãþ¤u¼tªº¹ê²{
¥¿¦p§Ú«e­±©Ò»¡ªº¡A¤@­ÓÃþ¤u¼t¥²¶·¥h«Ø¥ß§Ú­Ì¦Û©w¸qªº¤¶­±¡C¦b¤W­±¡A§Ú­Ì©w¸q¤F¦Û©w¸qªº¤¶­±¡A¨Ã¥ÑÃþTMyCOMServer ¥h¹ê²{¡C¨º»ò¡A²{¦b§Ú­ÌÁÙ­n°µªº¬O¡A¹ê²{Ãþ¤u¼t¡AµM«á¥ÑÃþ¤u¼t«Ø¥ß¤@­ÓTMyCOMServer ªº¤¶­±¹ê¨Ò¡CÃþ¤u¼t¤¶­±©w¸q¦p¤U¡G
IClassFactory = interface(IUnknown)
['{00000001-0000-0000-C000-000000000046}']
function CreateInstance(const UnkOuter: IUnknown; const IID: TGUID;
out Obj): HResult; stdcall;
function LockServer(fLock: Boolean): HResult; stdcall;
end;
ª`·N¡AIclassFactory¬O¨t²Î¹w¥ý©w¸q¤Fªº¡A¦bACTIVEX³æ¤¸¦³¡A©Ò¥H¤£»Ý­n¦Û¤v¦A¥h©w¸q¤@¦¸¡C§Ú­Ì¥u­n¥h¹ê²{¥¦´N¬O¡G
TClassFactory = class(TObject, IClassFactory)
protected
FLock: integer;
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
public
Constructor Create;
function CreateInstance(const UnkOuter: IUnknown; const IID: TGUID;
out Obj): HResult; stdcall;
function LockServer(fLock: Boolean): HResult; stdcall;
end;
§Ú­Ì¥uÃöª`CreateInstance ¤èªk¡CLockServer ¥Î©ó¦b¦h«È¤á½Õ¥ÎCOM®É¡AÂê©wCOM¡A¥H§K¤@­Ó«È¤á°h¥X®É¾P·´¤FCOM¡A¨º»ò¨ä¥L«È¤áªº½Õ¥Î±Nµo¥Í¿ù»~¡C¦ý¬O§Ú­Ì¦b³oùØ¥u¹ê²{³æ«È¤á¡A©Ò¥H¤£¦Ò¼{³o­Ó¨ç¼Æ¡A§â¥L¸mªÅ´N¬O¡C
function TClassFactory.CreateInstance(const UnkOuter: IInterface;
const IID: TGUID; out Obj): HResult;
begin

//§Ú­Ìªº¦Û©w¸q¤¶­±¡A´N¬O¦b³oùسQ³Ð«Øªº¡C
MC := TMyCOMServer.Create;
Pointer(Obj) := Pointer(MC);
end;

function TClassFactory.LockServer(fLock: Boolean): HResult;
begin

end;

¦P¼Ëªº¡ATclassFactory¤]¥²¶·¹ê²{¤Þ¥Î­p¼Æ¡A¦]¬°¥¦¤]¹ê²{¤FIunknown¤¶­±¡C
function TClassFactory._AddRef: Integer;
begin
Inc(FLock);

end;

function TClassFactory._Release: Integer;
begin
Dec(FLock);
if FLock = 0 then
Free;
end;

function TClassFactory.QueryInterface(const IID: TGUID; out Obj): HResult;
begin

end;
¨ä¤¤¡AQueryInterface §Ú§â¥¦¸mªÅ¡A¦]¬°¦b³o­Ó¨Ò¤l¤¤¡A¤£»Ý­n¦V¥¦¬d¸ß¤°»ò¤¶­±¡C¦pªG¥H«áŪªÌ»Ý­n¦V¥¦¬d¸ß¤¶­±®É¡A¦Û¤v¹ê²{¬ÛÃö¥N½X¡C
¦P¼Ë¡A¦b¥¦ªººc³y¾¹¤¤¡A¤]¹w¥ý¹ï­p¼Æ¥[1
constructor TClassFactory.Create;
begin
Inc(FLock);
end;

¨ì¥Ø«e¬°¤î¡A§Ú­Ì¤w¸g°ò¥»¹ê²{¤F¤@­ÓCOM»Ý­nªº¤j³¡¤À¥\¯à¡C²{¦b¡A§Ú­Ì»Ý­n§â¥¦µù¥U¨ì¨t²Î¤¤¡A¥H«K³Q¨ä¥Lµ{¦¡½Õ¥Î¡C
l COMªºµù¥U©M¤Ïµù¥U
§Ú­Ì¦^¹LÀY¨Ó¡A¬Ý¬Ý¦p¦ó¥h¹ê²{¨º¥|­ÓDLLªº¿é¥X¨ç¼Æ¡C³o¥|­Ó¨ç¼Æªº­ì§Î¦p¤U¡G
function DllGetClassObject(const CLSID, IID: TGUID; var Obj): HResult;stdcall;
function DllCanUnloadNow: HResult;stdcall;
function DllRegisterServer: HResult;stdcall;
function DllUnregisterServer: HResult;stdcall;

§Ú­Ì¤W­±©Ò»¡ªºÃþ¤u¼tªº¹ê¨Ò¡A´N¬O¦bDllGetClassObject ¤¤³Ð«Øªº¡C¥N½X¦p¤U¡G
function DllGetClassObject(const CLSID, IID: TGUID; var Obj): HResult;
begin
CF := TClassFactory.Create;
Pointer(obj) := Pointer(CF);
Result := S_OK;
end;
¦P¼Ëªº¡A§Ú­Ì¥u¦³¤@­ÓÃþ¤u¼t¡A©Ò¥H¥i¥H¤£²z·|«e­±¨º¨â­Ó°Ñ¼Æ¡C§_«h¡A´N­n®Ú¾Ú¤£¦PGUID¡A¨Ó³Ð«Ø¤£¦PªºÃþ¤u¼tª«¥ó¡C¦b³oùØ¡A§Ú­Ìª½±µ§âÃþ¤u¼tª«¥óµ¹ªð¦^¤F¡C
¨ç¼ÆDllCanUnloadNow ¥Î¨Óµù¾P¤@­ÓCOM¡C¦b¥¿±`¨Ï¥Î¤¤¡A­n®Ú¾Ú¤Þ¥Î­p¼Æ¡A¨Ó§PÂ_¬O§_¤¹³\¥Î¤áµù¾P¡C¦b³oùاڭ̪½±µªð¦^S_OK¡AÅý¥Î¤áª½±µµù¾P¡C
function DllCanUnloadNow: HResult;
begin
Result := S_OK;
end;
¨ç¼ÆDllRegisterServer ¥Î¨Ó¦Vµù¥Uªíµù¥U¤@­ÓCOM¤¸¥ó¸ê°T¡C­nµù¥U¤@­ÓCOM¡A¥Î¤á¥²¶·ª¾¹DCOM¦bµù¥Uªí¤¤ªº¸ê°T¬O¦p¦ó²Õ´ªº¡Cµ²ºc¦p¤U¡G
HKEY_CLASSES_ROOT
---- CLSID
---- GUID
----- InprocServer32 ¼Ð©ú COM©Ò¦bºÏ¤ùªº¸ô®|¥H¤Î½uµ{¼Ò«¬
----- ProgID ¼Ð©úCOM©Ò¹ê²{ªº¤¶­±
----- TypeLib ¼Ð©ú COM ªºÃþ«¬®wªºGUID
----- Version ¼Ð©ú COMªºª©¥»¸¹¡C
·íµo¥ÍCreateCOMObject()½Õ¥Î®É¡A¿é¤J°Ñ¼Æ¬°COMªºCLASSÃþ«¬ªºGUID¡A¨t²Î±N¦bµù¥Uªí¤¤·j¯Á¨ì¬ÛÃö¸ê°T¡AµM«á´N¥i¥H§ä¨ì¸ÓCOMªº¦ì¸m¡A´N¥i¥H¶}©l½Õ¥Î¤F¡C
ª`·N¡A¦pªG±z§Æ±æCOM¤¸¥ó¤ä´©¥Î¤áºÝªºCreateOLEObject()¨ç¼Æªº½Õ¥Î¡A±z¥²¶·ÁÙ­nµù¥U¤@­Ó¸ê°T¡G
HKEY_CLASSES_ROOT
----- ¤¶­±Án©ú
----- CLSID ¼Ð©ú COM ¤¶­±©MCLASSÃþ«¬ªºGUIDªº¹ïÀ³Ãö«Y¡C
¨º»ò¡A·íµo¥Í CreateOLEObject ½Õ¥Î®É¡A¨t²Î±N·|®Ú¾Ú¿é¤J°Ñ¼Æ¡]¤@­ÓCOM¤¶­±Án©ú¡A¦pa.b¡^¡A¥h¬d§ä©M¤¶­±¹ïÀ³ªºCLASS GUID¡AµM«á´N¥i¥HŪ¨ìCOMªº¬ÛÃö¸ê°T¤F¡C
¥þ³¡¥N½X¦p¤U¡G
function DllRegisterServer: HResult;
var
lp: pchar;
ns: Dword;
begin
Result := S_FALSE;
Reg := TRegistry.Create;
GetMem(lp, 255);
try
Reg.RootKey := HKEY_CLASSES_ROOT;
if Reg.OpenKey('\MyCOM.MyCOMTest',true) then
begin
Reg.CreateKey('CLSID');
if Reg.OpenKey('CLSID',true) then
Reg.WriteString('',GUIDToString(Class_MyCOM));
end;
if Reg.OpenKey('\CLSID\' + GUIDToString(Class_MyCOM), true) then
begin
if Reg.CreateKey('InprocServer32') = false or
Reg.CreateKey('ProgID') = false or
Reg.CreateKey('TypeLib') = false or
Reg.CreateKey('Version') = false then
Exit;
Reg.WriteString('','MyCOM');
if Reg.OpenKey('\CLSID\' + GUIDToString(Class_MyCOM) +
'\InprocServer32', false) then
begin
Windows.GetModuleFileName(HInstance,lp, 255);
Reg.WriteString('', lp);
Reg.WriteString('ThreadingModel', 'Single');
end;
if Reg.OpenKey('\CLSID\' + GUIDToString(Class_MyCOM) + '\ProgID', false) then
Reg.WriteString('','MyCOM.MyCOMTest');
if Reg.OpenKey('\CLSID\' + GUIDToString(Class_MyCOM) + '\Version', false) then
Reg.WriteString('','1.0');
if Reg.OpenKey('\CLSID\' + GUIDToString(Class_MyCOM) + '\TypeLib', false) then
Reg.WriteString('',GUIDToString(LIBID_MyCOM));

Reg.CloseKey;
Result := S_OK;
end;
finally
begin
FreeMem(lp);
Reg.Free;
end;
end;
end;

¨ç¼ÆDllUnregisterServer «h¦V¨t²Îµn¥X¤@­ÓCOMªºµù¥U¸ê°T¡C¥¦¤ñ¸û²³æ¡Aª½±µ§âCOMªº¬ÛÃöµù¥UÁäµ¹§R°£´N¬O¡G
function DllUnRegisterServer: Hresult;
begin
Result := S_False;
Reg := TRegistry.Create;
try
Reg.RootKey := HKEY_CLASSES_ROOT;
Reg.DeleteKey('\CLSID\' + GUIDToString(Class_MyCOM));
Reg.CloseKey;
Finally
Reg.Free;
end;
end;
l ³Ì«á¤u§@¡C
²{¦b¡A§Ú­Ì½s͵{§Ç¡AµM«á¥Í¦¨¤@­ÓDLLÀÉ¡A¦b©R¥O¦æ¤U¡A¨Ï¥Î¡G
regsvr32 MyCOM.dll
¦V¨t²Îµù¥UCOM¡C


COM Clientµ{¦¡
¦bDELPHI¤¤½Õ¥Î
·s«Ø¤@­Ó±M®×¡AµM«á¦b³æ¤¸¤¤¡A©w¸q¤¶­±¸ê°T¡G
IMyCOMTest = interface(IUnknown)
['{D1C4A022-7F6F-42F0-A9B0-4A91703EB124}']
function msg: integer;stdcall;
end;
©w¸qÅܼơG
class_wjm: TGUID = '{CE38847E-A386-4753-89F1-34BE80042107}';
a: IMyCOMTest;
µM«á¦bµøµ¡ªºOnCreate ¨Æ¥óùØ¡A²K¥[¦p¤U¥N½X¡G
procedure TForm1.FormCreate(Sender: TObject);
begin
//ÀH«K¥Î­þ­Ó³£¥i¥H
a := createcomobject(class_wjm) as IMyCOMTest;
//©ÎªÌ¨Ï¥Î a := createoleobject('MyCOM.MyCOMTest') as IMyCOMTest;
end;
µM«á¡A©ñ¤@­Ó«ö¶s¡A¨Ã¦b¨ä¨Æ¥óùزK¥[¥N½X¡G
procedure TForm1.Button1Click(Sender: TObject);
begin
showmessage(inttostr(a.msg));
end;

¦bµ¡¤fªºOnCLose¨Æ¥ó¨½¥[¤W¡G
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
a := nil;
end;
ª`·N¤@©w­nÄÀ©ñ¤¶­±¡A§_«h¥i¯à¬O­ÓÃø¬Ýªº AV ¿ù»~®@¡C
¹B¦æ§Ú­Ìªºµ{¦¡¡AÂI¤U«ö¶s¡A§A±N¬Ý¨ì¿é¥X¸ê°T¡§1978¡¨¡C
¦pªG§A¬Ý¤£¨ì¥¿½Tªº¸ê°T¡A½Ð¥J²Ó¬d¬Ý§Aªº¥N½X¬O§_©M¤å¤¤¤@­P¡C§A¤]¥i¥Hª½±µ¦V§Ú¯Á­n·½¥N½X¡C

¦bVC6¤¤½Õ¥Î
µy·L½ÆÂøÂI¡C¥ý§âGUID½Ķ¹L¨Ó¡G
//{CE38847E-A386-4753-89F1-34BE80042107};
static const CLSID CLSID_MyCOM = {0xCE38847E,0xA386,0x4753,
{0x89,0xF1,0x34,0xBE,0x80,0x04,0x21,0x07}};
//{D1C4A022-7F6F-42F0-A9B0-4A91703EB124}
static const IID IID_MyCOM = {0xD1C4A022,0x7F6F,0x42F0,
{0xA9,0xB0,0x4A,0x91,0x70,0x3E,0xB1,0x24}};
µM«á¦bÁn©ú¤@¦¸¤¶­±ªº©w¸q¡G
struct IMyCOMTest : public IUnknown
{
virtual LONG __stdcall msg();
};
IMyCOMTest* pLink;
µM«á©ñ­Ó«ö¶s¤W¥h¡A¨Ã¦b¬ÛÃö¨Æ¥óùؼg¥N½X¡G
void CMyvcView::OnButton6()
{
pLink = NULL;
int a =0;
CoInitialize(NULL);
a = CoCreateInstance(CLSID_MyCOM, NULL,
CLSCTX_INPROC_SERVER,IID_MyCOM, (void**)&pLink);
if (a==S_OK){
LONG a= pLink->msg();
};
}
ª`·N¡A¤@©w­n°O¦í½Õ¥Î CoInitialize(NULL); ³o­Ó¨ç¼Æ¡A§_«hCOMµLªk¨Ï¥Îªº¡C
½s͹B¦æ¡A§AÀ³¸Ó¯à¬Ý¨ì a ¬Oµ¥©ó1978 ªº¡C
Á`µ²
¨ì¥Ø«e¬°¤î¡A§Ú­Ì¦¨¥\ªº½s¼g¤F¤@­Ó³Ì²³æªºCOM¤¸¥ó¡A¨Ã¥B¦bDELPHI©MVC¤¤¦¨¥\½Õ¥Î¡C³o³£»¡©ú§Ú­Ìªº¤u§@¬O¦¨¥\ªº¡C¦P®É§Ú­Ì¤]¬Ý¨ì¡A¹ê²{¤@­ÓCOM¡A¨Ã¤£Ãø¡C
Ãö©ó¶iµ{¥~ªºCOM¥H¤ÎDCOM¡A«eªÌ¬O°ò©óLPC ¥»¦aµ{§Ç©I¥s¡A«áªÌ¬O°ò©óRPC»·ºÝµ{§Ç©I¥s¡C°£¤F¨óij¤£¦P¥~¡A¨ä¥Lªº³£¤@¼Ë¡C¤j®a¦³¿³½ì¡A¥i¥H¥H«áÄ~Äò°Q½×¡C
Ãö©óCOMªº½uµ{¼Ò¦¡¡A§Ú´¿¸g¥H¬°¡A¬OCOMÂQ¾É¤¤¦Û°Ê·|²£¥Í¹ïÀ³ªº½uµ{¥N½X¡A¨Ó¹ê²{¦h½uµ{ªº¡C¦ý¬O§Ú«á¨Ó¤S»{¬°¡A®Ú¥»¨S¦³³o¦^¨Æ¡ACOM¥u¬O°µ¤F­Ó¼Ð°O¡A§i¶D§@·~¨t²Î¥Lªº½uµ{¼Ò«¬¡A¦Ü©ó¦p¦ó²£¥Í½uµ{¡A«h¬O§@·~¨t²Î°µªº¡C¦³Ãö³o¤è­±ªº°Q½×¡AÁٻݭn¶i¤@¨B¬ã¨s¡C
¤@­Ó¤p§À¤Ú
§Ú­Ìª¾¹D¡A¦bDELPHIùØ¡A¦³¤@­ÓImport Type Library ªº¥\¯à¡C¥i¥H§â¤@­ÓCOM¤¸¥ó¾É¨ìDELPHI¤¤ª½±µ¨Ï¥Î¡C¦ý¬O¡A¦pªG§Ú­Ì¸Õ¹Ï§â§Ú­Ì­è¤~¼gªº¨º­Ó¤¸¥ó¡A¤]ADD¶i¥hªº®É­Ô¡ADELPHI·|´£¥Ü¡G
¸ü¤JÃþ«¬®w/DLL®É¥X¿ù¡C
³o¬O«ç»ò¦^¨Æ©O¡H ­ì¨Ó¡A³o¬OMS/BORLANDªº¤@­Ó¤pªá©Û¡C§Ú­Ì¬Ý¬ÝVCLªº¥N½X´Nª¾¹D¤F¡A¦bDELPHIªºÂQ¾É¬°§A³Ð«Ø¤@­ÓCOM®É¡A¥¦°½°½¦a¥[¤F¤@­ÓIprovideClassInfo ªº¤¶­±¶i¥h¡A¸Ó¤¶­±¨Ï¥ÎItypeInfo ¤¶­±¡A¥D­n¥Î©ó¦V¥~´£¨ÑCOMªºÃþ«¬¸ê°Tªº¡C¤j®a¥J²Ó¸ò¤UTtypedComObject ³o­ÓÃþ¡A´N·|µo²{³o­Ó¶ø¯µ¤F¡C¦b«e¨Ò¤¤¡A§Ú­Ì¨S¦³¹ê²{³o­Ó¤¶­±¡A¨º»ò·íµMµLªk³QDELPHI¸ü¤J¤F¡CÃö©ó¦p¦ó¹ê²{³o­Ó¤¶­±¡A¤w¸g¶W¥X¤F¥»¤åªº½d³ò¡A©Ò¥H¤£©ó°Q½×¡C
¦³¿³½ìªºªB¤Í¡A¥i¥HÄ~ÄòÃöª` ¡§COM¹ê²{¹Lµ{¡]2¡^¡¨¡A¥D­nÁ¿­z¦p¦ó¹ê²{Ãþ«¬®wªº¡C


2002/6/27
ª©Åv©Ò¦³
Âà¸ü®É½Ð¥]¬A§@ªÌ©m¦W





〓¤¤°ê¶Â«ÈÁp·ù¡]CHU¡^〓«e®Ö¤ß¦¨­û¡A²{¬°ºaÅA·|­û
〓¤¤°ê¶Â«ÈÁp·ù¡]CHU¡^〓ºôµ¸¹q¤lÂø»x¡m¯x°}¡n½s¿è
­·°ó§Þ³N¤u§@«Ç
³»³¡
bee1004 (·R¡\¡¯)
ºaÅA²z¨Æ
Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

ºaÅA¾±³¹ ³Ç¥X¦¨´N³¹ ¤j²³©¾¸Û³¹ ¤j²³¼ö¸Û³¹ ¥Í¬¡¥ð¶¢³¹ ¨¬±m½ä°­³¹ °Ï¥D³¹ ¶ø¹BºÖ«½ ¥_¨Ê¶ø¹B2008

UID¡G 326027

©Ê§O¡G ¨k

ºëµØ¡G 3 ½g

¿n¤À¡G 10271 ÂI

©«¤l¡G 19093 ½g

  ¤j ¤¤ ¤p
µoªí©ó 2006-12-7 20:45  ¸ê®Æ  ­Ó¤HªÅ¶¡  µu®ø®§  ¥[¬°¦n¤Í  ²K¥[ bee1004 ¬°MSN¦n¤Í ³q¹LMSN©M bee1004 ¥æ½Í ICQ ª¬ºA
­ø«Y¦n©ú«Y«§¡Ð¡D¡Ð¡¨





¡@¡@¡@¡@¡@      §Ú·Rªâ>¢²<
                ¢Ý
     ¢~ vv¢¡¢÷
     (¡¯m¡¯)¡@
       /¢h\      
¥»¤H©Òµoªº©«¡A©Ò¦³§¡¬°Âà¶K(§j¤ô°Ï°£¥~)¡A¦p¹ï©«¤l¦³¥ô¦ó²§Ä³¡A¥»¤H´n¤£­t³d¡C
³»³¡
lohhiutung
¤j²³¤^¤¢

ºaÅA¾±³¹ ¥Ø«e¨S¦³¾±³¹

UID¡G 526388

©Ê§O¡G ¨k

ºëµØ¡G 0 ½g

¿n¤À¡G -6 ÂI

©«¤l¡G 139 ½g

  ¤j ¤¤ ¤p
µoªí©ó 2007-8-12 19:23  ¸ê®Æ  ­Ó¤HªÅ¶¡  µu®ø®§  ¥[¬°¦n¤Í 
¦^´_ #1 chan0006 ªº©«¤l

­ø«Y¦n©ú«Y«§¡Ð¡D¡Ð¡¨





J
³»³¡

 



¥»¯¸³]³Æ¾¹§÷¥Ñ Many Way (HK) Limited ÃÙ§U´£¨Ñ
·í«e®É°Ï GMT+8, ²{¦b®É¶¡¬O 2008-9-8 13:30

Advertisting Agency

Audit and Analytics

Partner Companies

Powered by Discuz! 5.5.0¢x0.106791 (s), 7 queries, Copyright © 2008 HK-PUB.COM All Rights Reserved. ¥»¯¸Án©ú - ¼s§i¬d¸ß - ²M°£ Cookies - Ápô§Ú­Ì - ¤j²³½×¾Â - Archiver - WAP