c++中调用com组件(DLL),如果没有tlb文件,该怎么调用!

ishouyong 2009-04-10 11:53:21
新手问题!

如题,我在网上找了段代码。。但代码里面要求用到tlb文件。

而我手上的一个dll却没有。。该怎么使用呢?


#include "stdafx.h"
#import "Youtube.tlb"
#include <stdio.h>
#include <comutil.h>
#pragma comment(lib,"comsuppw.lib")
using namespace Youtube;
int _tmain(int argc, _TCHAR* argv[])
{
CoInitialize(NULL);
  try
{
IYoutubeServicePtr service( __uuidof( YoutubeService ) );
service->UploadFile();
}
  catch (const _com_error& e)
  {
  }
  CoUninitialize();
  return 0;
}
...全文
3119 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
deping_chen 2009-04-14
  • 打赏
  • 举报
回复
在C++中使用#import可以导入类型库,生成tlh和tli文件,C++编译器会把tlh当做头文件使用。
类型库可能在tlb文件中或者在dll、exe文件中作为资源嵌入。
成功没成功你看工程的Debug或Release中有没有tlh生成就可以了。
#import的使用可以参考MSDN,这是程序员的宝库,须臾不可或缺的。
ishouyong 2009-04-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 deping_chen 的回复:]
在C++中使用#import可以导入类型库,生成tlh和tli文件,C++编译器会把tlh当做头文件使用。
类型库可能在tlb文件中或者在dll、exe文件中作为资源嵌入。
成功没成功你看工程的Debug或Release中有没有tlh生成就可以了。
#import的使用可以参考MSDN,这是程序员的宝库,须臾不可或缺的。
[/Quote]

我已经在msdn里面查过了,感谢你的回复。
ishouyong 2009-04-11
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 HotSoftg 的回复:]
1.tlb文件可能已经在DLL中。
用#Import 导出来。

2.如果DLL中没有。
知道函数名称也能行。但是如何函数名称也不知道。那就不好玩了。
[/Quote]

感谢你的回答。

我是一个初学者,也请原谅我的无知。

不知道你能否帮我解答下这问题:“用#Import 导出来”,怎么判断有没有导出来呢?
HotSoftg 2009-04-11
  • 打赏
  • 举报
回复
1.tlb文件可能已经在DLL中。
用#Import 导出来。

2.如果DLL中没有。
知道函数名称也能行。但是如何函数名称也不知道。那就不好玩了。
ishouyong 2009-04-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 paerxiushi 的回复:]
使用最原始的调用COM组件的方法,这个方法假设COM组件的dll已经被注册到系统中了。
CoInitialize(NULL) ;

IX* pIX = NULL ;
HRESULT hr = CoCreateInstance(CLSID_CA,
NULL,
CLSCTX_INPROC_SERVER,
IID_IX,
(void**)&pIX) ;
if (SUCCEEDED(hr))
{

pIX->Fx() ;

IY* pIY = NULL ;
hr = pIX->QueryInterface(IID_IY, (void**)&pIY) ;
if (SUCCEEDED(hr))
{
pIY->Fy() ;

IX* pIX2 = NULL ; …
[/Quote]

我试下。。。

感谢。。
ishouyong 2009-04-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 amwfnyq 的回复:]
tlb文件可以自己生成
[/Quote]

能详细说明下么?
paerxiushi 2009-04-11
  • 打赏
  • 举报
回复
使用最原始的调用COM组件的方法,这个方法假设COM组件的dll已经被注册到系统中了。
CoInitialize(NULL) ;

IX* pIX = NULL ;
HRESULT hr = CoCreateInstance(CLSID_CA,
NULL,
CLSCTX_INPROC_SERVER,
IID_IX,
(void**)&pIX) ;
if (SUCCEEDED(hr))
{

pIX->Fx() ;

IY* pIY = NULL ;
hr = pIX->QueryInterface(IID_IY, (void**)&pIY) ;
if (SUCCEEDED(hr))
{
pIY->Fy() ;

IX* pIX2 = NULL ;
hr = pIY->QueryInterface(IID_IX, (void**)&pIX2) ;
if (SUCCEEDED(hr))
{
pIX2->Fx() ;
pIX2->Release();
}
else
{
cout<<"Could not get interface IX from IY."<<endl; ;
}
pIY->Release() ;
}


pIX->Release() ;
}
else
{
cout<<"Could not create component."<<endl;;
}

// Uninitialize COM Library
CoUninitialize() ;
return 0;
paerxiushi 2009-04-11
  • 打赏
  • 举报
回复
有些COM组件的tlb是做在dll中的,对待这种情况的处理方法如下:
#import <msxml4.dll>
using namespace MSXML2;
try
{
::CoInitialize(NULL);
MSXML2::IXMLDOMDocument2Ptr xml;
xml.CreateInstance(__uuidof(MSXML2::DOMDocument));
if(!xml->load(_bstr_t(m_sFilePath)))
return false;

int i= 1;
bool bNode = TRUE;
MSXML2::IXMLDOMNodePtr node;




_stprintf(strRoot,_T("/%s/%s/Property[%i]"),m_sRootNode,m_sSubNode,i);
i++;

node = xml->selectSingleNode(_bstr_t(strRoot));
if (node)
{
MSXML2::IXMLDOMNamedNodeMapPtr pAttrs = NULL;
MSXML2::IXMLDOMNodePtr pAttrItem;
node->get_attributes(&pAttrs);
}
}
catch(...)
{
return false;
}
请楼主试试
黄志义 2009-04-10
  • 打赏
  • 举报
回复
tlb文件可以自己生成

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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