怎样得知COM对象的IID及VC中如何创建和使用COM对象
韦翔罂 2008-08-21 11:12:46
正在COM入门,试验中遇到难题--
我用Visual FoxPro9.0将一个项目Project1中的类TEST(类中只有一个自定义方法opentable)编译成一个COM,生成的COM部件名是Project1.TEST,并且在Visual FoxPro9.0中测试,调用类TEST的方法opentable运行正确。
但是,用VC编写的客户程序里不知该怎么创建这个COM对象,好像需要调用API:
WINOLEAPI CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter,
DWORD dwClsContext, REFIID riid, LPVOID FAR* ppv);
其中有一项参数‘REFIID riid’应该是‘方法opentable’所对应的接口IID吧,那么,如何得到呢?尝试了下面的途径:
首先通过注册表查找:打开注册表,只看到Project1.TEST的接口CLSID,却没有标出其中的‘方法opentable’的接口IID;
然后用VC6的OLE/COM Object View查看:打开VC6的OLE/COM Object View,找到COM部件Project1.TEST,双击打开,内容如下
// Generated .IDL file (by the OLE/COM Object Viewer)
// typelib filename: Project1.dll
[uuid(3472BE1C-760A-4309-B3E6-A64503420B27),
version(1.0),
helpstring("\xFFFFFFCF\xFFFFFFEE目1 Type Libra")]
library \xFFFFFFCF\xFFFFFFEE?
{
// TLib : // TLib : OLE Automation : {00020430-0000-0000-C000-000000000046}
importlib("stdole2.tlb");
// Forward declare all types defined in this typelib
interface Itest;
[odl,
uuid(B39D2C1A-B151-45E5-89C8-82BF55E7869B),
helpstring("Project1.test"),
hidden,
dual,
nonextensible,
oleautomation ]
interface Itest : IDispatch {
[id(00000000), propget, helpstring("指定用户自定义类库的文件名,该类库包含对象的类。")]
HRESULT ClassLibrary([out, retval] BSTR* ClassLibrary);
[id(0x00000001)]
HRESULT opentable([out, retval] VARIANT* RetVal);
[id(0x00000002), propget, helpstring("指定在代码中用以引用对象的名称。")]
HRESULT Name([out, retval] BSTR* Name);
[id(0x00000002), propput, helpstring("指定在代码中用以引用对象的名称。")]
HRESULT Name([in] BSTR Name);
······//有很多类似的,在这里我就省略了。
HRESULT SetAll(
BSTR cProperty,
VARIANT Value,
BSTR cClass,
[out, retval] VARIANT* RetVal); };
[uuid(5CB425B4-DD80-4750-AE5E-D757EAF56947),
helpstring("Project1.test") ]
coclass test {
[default] interface Itest; };};
我想,其中有一句‘opentable([out, retval] VARIANT* RetVal);[id(0x00000002)’中的id(0x00000002)是不是‘方法opentable’的接口IID呢?怎么用呢?我试着将它加上Project1.TEST的接口CLSID作为‘方法opentable’的接口IID放到CoCreateInstance调用,程序如下
#include "windows.h"
#include <stdio.h>
#include <comutil.h>
void main()
{
CoInitialize(NULL);
static const GUID TESTclsid={0x3472be1c,0x760a,0x4309,
{0xb3,0xe6,0xa6,0x45,0x03,0x42,0x0b,0x27}};
//Project1.TEST的接口CLSID
static const GUID TESTopeniid={0x3472be1e,0x760a,0x4309,
{0xb3,0xe6,0xa6,0x45,0x03,0x42,0x0b,0x27}};
//我是用那个id(0x00000002)加上上面的Project1.TEST的接口CLSID,得到TESTopeniid,作为Project1.TEST的‘方法opentable’的接口IID,不知对不?
IUnknown *pUnknown;
CoCreateInstance(TESTclsid, NULL, CLSCTX_INPROC_SERVER,TESTopeniid, (void **)&pUnknown);
printf("%s",pUnknown->opentable );
}
结果有错误提示 error C2039: 'opentable' : is not a member of 'IUnknown'
由于时间较紧张,COM方面的学习只想面向应用,即主要着重于掌握如何在客户程序中创建和使用COM对象,而不是掌握如何开发一个COM组件,很多COM的书都是大篇幅介绍如何开发COM组件,而对创建和使用COM对象的叙述显得有些散乱,特别是VC++中创建和使用COM对象很复杂,要求客户程序中首先#include接口类定义文件,可是Visual FoxPro9.0生成COM部件时只生成了两个文件,一个是Project1.dll,一个是Project1.tlb,哪里有什么接口类定义文件哟,没有接口类定义文件,VC中好像就无法创建COM对象了,
不像VB、VFP那样创建一个COM对象只需一句CREATEOBJECT就搞掂了,所以希望大家在这一方面给予热心指点,非常感谢!