一个关于COM接口的问题

ajet 2002-06-24 10:19:28
只知一个Interface的GUID为"6C44DF74-72B9-4992-A1EC-EF996E0422D4",其它的什么都不知道的情况下,怎么得到它的CComPtr指针?请指教,谢谢!
...全文
59 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
johnnyxia 2002-07-01
  • 打赏
  • 举报
回复
你可以用class wizard。它可以帮你导入你要用的com object。

打开class wizard,选Add Class|From a type library。然后选则你要导入type library。
有的com object有专门的type library file,以tlb为扩展名。有的com object的type-library是以资源形式存在于dll,ocx或exe中的。class wizard可以打开任何一种形式的type libary.

c++ builder之类的工具,我想也是通过导入type-library来导入com object的,不同的只是操作方法。type-library本身有一个guid,他也会在注册表中记录自己的位置,同时com object在注册表中的记录也会指明它的type-library的guid。所以只要有com object的clsid,总是能通过注册表找到它的type library。我想c++ builder就是这么做的。
ajet 2002-06-25
  • 打赏
  • 举报
回复
是的,这个方法是可以生成的,但那只是IDispatch接口的指针,怎么才能将其转换成我自己的接口类型的指针呢?谢谢!
kingzai 2002-06-24
  • 打赏
  • 举报
回复
get CLSID first,and CoCreateInstance,then QueryInterface
HRESULT CLSIDFromProgID(
LPCOLESTR lpszProgID, //Pointer to the ProgID(in)
LPCLSID pclsid //Pointer to the CLSID(out)
);

johnnyxia 2002-06-24
  • 打赏
  • 举报
回复
Interface只是一个接口,必须有一个com class实现他。所有你必须有个class guid. 有了class guid你才能创建这个class的实体(instance),然后向这个instance QueryInterface()你需要的接口。

或者,你已经通过某些方法拿到了某个object的其他interface的指针,可以通过这个interface,query到其他interface的指针。
ajet 2002-06-24
  • 打赏
  • 举报
回复
有会的人吗?
kingzai 2002-06-24
  • 打赏
  • 举报
回复
//try this code
const CLSID CLSID_First_ATL =
{0x970599E0,0x2673,0x11D3,{0xA8,0xA8,0x00,0x10,0x5A,0xA9,0x43,0xDF}};
LPDISPATCH lpDisp;
hr=CoCreateInstance(CLSID,NULL,CLSCTX_INPROC_SERVER,IID_IUnknown,(LPVOID*)&lpDisp);
if(FAILED(hr))
{
TRACE("CoCreateInstance Failed\n");
return FALSE;
}
ajet 2002-06-24
  • 打赏
  • 举报
回复
但是ADO的这种方法使用前提是要导出类型库的,而C++ BUILDER却不用,只要有ProgID或者CLSID就行了的,VC里我就是不懂怎么做了,并不是我想钻这个牛角尖,只是出于无奈啊,我现在想调用的那个COM的类型库有问题,导不出,但用C++ builder上面的那种方法就可以用,可是VC我就没招了。
kingzai 2002-06-24
  • 打赏
  • 举报
回复
当然有了,ADO中的使用就是象你上面那样:
_ConnectionPtr pConnection = NULL;
//Open a connection
TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
pConnection->Open(strCnn,"","",adConnectUnspecified);
类似的,ASP中调用COM组件的方法也是很简单的
ajet 2002-06-24
  • 打赏
  • 举报
回复
kingzai() :
假如我现在只知道const IID IID_IFirst_ATL =
{0xC8F6E230,0x2672,0x11D3,{0xA8,0xA8,0x00,0x10,0x5A,0xA9,0x43,0xDF}};
但却连IFirst_ATL所在的头文件也没有,那该怎么办呢?

其实我的意思是在VC中有没有一个很方便的调用COM的方法,能够方便得象C++ builder一样的.C++ BUILDER是这样写的:

Variant Voice;
CoInitialize(NULL);

//"Sapi.Spvoice"是所要调用的COM组件的ProgID
Voice=CreateOleObject("Sapi.SpVoice");

//调用了此COM组件的Speak方法
Voice.OleProcedure("Speak","",Variant(2));

CoUninitialize();

kingzai 2002-06-24
  • 打赏
  • 举报
回复
example code:
const IID IID_IFirst_ATL =
{0xC8F6E230,0x2672,0x11D3,{0xA8,0xA8,0x00,0x10,0x5A,0xA9,0x43,0xDF}};

const CLSID CLSID_First_ATL =
{0x970599E0,0x2673,0x11D3,{0xA8,0xA8,0x00,0x10,0x5A,0xA9,0x43,0xDF}};

void main(void)
{
// Declare and HRESULT and a pointer to the Simple_ATL interface
HRESULT hr;
IFirst_ATL *IFirstATL = NULL;

// Now we will intilize COM
hr = CoInitialize(0);

// Use the SUCCEEDED macro and see if we can get a pointer
// to the interface
if(SUCCEEDED(hr))
{
hr = CoCreateInstance( CLSID_First_ATL, NULL, CLSCTX_INPROC_SERVER,
IID_IFirst_ATL, (void**) &IFirstATL);

// If we succeeded then call the AddNumbers method, if it failed
// then display an appropriate message to the user.
if(SUCCEEDED(hr))
{
long ReturnValue;

IFirstATL->AddNumbers(5, 7, &ReturnValue);
cout << "The answer for 5 + 7 is: " << ReturnValue << endl;
IFirstATL->Release();
}
else
{
cout << "CoCreateInstance Failed." << endl;
}
}
// Uninitialize COM
CoUninitialize();
}
ajet 2002-06-24
  • 打赏
  • 举报
回复
class guid也有了的
CLSID SpVoice = {0x96749377, 0x3391, 0x11D2, {0x9E,0xE3,0x00,0xC0,0x4F,0x79,0x73,0x96}};

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧