VC中怎么使用COM组件?

wagnerwash 2002-02-26 02:14:25
最好是能在Console Application(without MFC support)中使用。
假如我有一个组件Com1.dll实现一个接口IMyCom1如下:
interface IMyCom1 : IDispatch
{
Func1();
};
怎么在程序中调用Com1.dll中IMyCom1的Func1()方法?
最好不要使用#import "Com1.dll" no_namespace的方法,因为这样必须在编译时指定使用的dll,岂不是还不如用一般的动态连接库,还能运行时LoadLibrary()?
...全文
602 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ashura 2002-02-28
  • 打赏
  • 举报
回复
参与一把……
luketang 2002-02-28
  • 打赏
  • 举报
回复
传入"SecurityMarket.NewsCenter"就可以调用本地的COM了。

最近用了SOAP,很方便。

但不知怎么样最方便地调用其他机器的COM?(即DCOM)
luketang 2002-02-28
  • 打赏
  • 举报
回复
不改了,自个凑合着看吧:
CLSID clsid;
LPCLASSFACTORY pClf;
LPUNKNOWN pUnk;
HRESULT hr;
IDispatch * pdisp;

//查找CLASS ID
if ((::CLSIDFromProgID(L"SecurityMarket.NewsCenter.1", &clsid)) != NOERROR)
{
return;
}

//产生类工厂
if ((::CoGetClassObject(clsid, CLSCTX_SERVER,
NULL, IID_IClassFactory, (void **) &pClf)) != NOERROR)
{
return;
}

//创建IUnknown指针
pClf->CreateInstance(NULL, IID_IUnknown, (void**) &pUnk);
hr = pUnk->QueryInterface(IID_IDispatch, (void**)&pdisp);

WCHAR *pMethodName = L"NewsList";

DISPID dispid;
DISPPARAMS dispparams;
VARIANTARG params[3];
VARIANT result;
CString ParamText;
EXCEPINFO ExceptInfo;

// Get dispatch ID corrisponding to method name.
hr = pdisp->GetIDsOfNames(IID_NULL, &pMethodName, 1, LOCALE_SYSTEM_DEFAULT, &dispid);
if(FAILED(hr))
{
TRACE(_T("Cannot get dispatch id of calc method."), hr);
return;
}

VariantInit(¶ms[0]);
params[0].vt = VT_I4;
params[0].intVal = 1001;

VariantInit(¶ms[1]);
params[1].vt = VT_I4;
params[1].intVal = 2;

VariantInit(¶ms[2]);
params[2].vt = VT_I4;
params[2].intVal = 1;

// Initialize DISPPARAMS structure.
dispparams.cArgs = 3;
dispparams.cNamedArgs = 0;
dispparams.rgdispidNamedArgs = NULL;
dispparams.rgvarg = params;

// Prepare result variant.
VariantInit(&result);

// Invoke the specified method.
hr = pdisp->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &dispparams, &result, &ExceptInfo, NULL);
if(FAILED(hr))
{
TRACE(_T("Invoke of calc method failed."));
}
else
{

// Convert result to a string.
VariantChangeType(&result, &result, 0, VT_BSTR);

// Display result.
//AfxMessageBox(CString(result.bstrVal));

*pCtxt << _T(CString(result.bstrVal));
}

// Clean up variants.
VariantClear(&result);
VariantClear(¶ms[0]);
VariantClear(¶ms[1]);
VariantClear(¶ms[2]);
tpProgramer 2002-02-28
  • 打赏
  • 举报
回复
讨论的很热烈.

帮你们推.
kissfire 2002-02-28
  • 打赏
  • 举报
回复
sign
han012 2002-02-27
  • 打赏
  • 举报
回复
mark
同桌老王 2002-02-27
  • 打赏
  • 举报
回复
wang9658@263.net
shuxh 2002-02-27
  • 打赏
  • 举报
回复
kimryo,
麻烦也给我一份例子程序,谢谢
shuxh@163.net
shuxh 2002-02-27
  • 打赏
  • 举报
回复
kimryo,
麻烦也给我一份例子程序,谢谢
shuxh@163.net

lgs 2002-02-27
  • 打赏
  • 举报
回复
看看MSDN中使用ADO的例子就一切解决了!
shuxh 2002-02-27
  • 打赏
  • 举报
回复
kimryo,
麻烦也给我一份例子程序,谢谢
shuxh@163.net


shuxh 2002-02-27
  • 打赏
  • 举报
回复
kimryo,
麻烦也给我一份例子程序,谢谢
lostall 2002-02-27
  • 打赏
  • 举报
回复
#import "progid:..." no_namespace named_guids
用progid,避免直接引入dll路径名。
具体可查MSDN
spdia 2002-02-27
  • 打赏
  • 举报
回复
只要你实现的每个Com对象中都有IMyCom1接口,并且有IMyCom1的声明和IID_IMyCom1,就可以CoCreateInstance(CLSID_Component, NULL, CLSCTX_ALL_SERVER, IID_IMyCom1, (void**) &ppv),#import需要dll中有类型库,他才能生成包裹类。
erlei1978 2002-02-27
  • 打赏
  • 举报
回复
up
idoloveyou 2002-02-26
  • 打赏
  • 举报
回复
那你就不用那么麻烦了
你既然有IMyCom1的定义和组建的CLSID,那就可以得到IID_IMyCom1(查询注册表,可以从CLSID查到IID,观察一下注册表就可以了),就根本不需要#include什么*.h, *.c的文件
直接CoCreateInstance(CLSID_Component, NULL, CLSCTX_ALL_SERVER, IID_IMyCom1, (void**) &ppv)不就可以了吗
wagnerwash 2002-02-26
  • 打赏
  • 举报
回复
to idoloveyou:
不一定是指定文件名,指定CLSID也可以。总之要在运行时确定。所以编译*.h、*_i.c的方法不行。
GetProcAddress()的方法详细的说来怎么做?是不是就是一般的dll导出函数?那样我也知道怎么做。之所以想用COM就是不想有“DLL地狱”的麻烦。
wagnerwash 2002-02-26
  • 打赏
  • 举报
回复
谢谢大家热情参与,我只能给100分,因此将在问题告一段落后给分。
有代码可以发到wagnerwash@sohu.com
idoloveyou 2002-02-26
  • 打赏
  • 举报
回复
你非要指定.dll文件名,又为什么非要用COM呢
直接LoadLibrary,然后GetProcAddress不久得了
kimryo 2002-02-26
  • 打赏
  • 举报
回复
只用progid就行了,但麻烦很多。XXX.h和XXX_i.c是MIDL.exe编译.idl文件生成的,.tlb文件是二进制的用于在VB或java中的调用。所以你应该在另一个工程中包含XXX.h和XXX_i.c,这样可以直接用你的IMyCom1* pMyCom=NULL;来定义指针、和使用接口ID:IID_IMyCom1常量等。你要示例工程我可以发给你。
加载更多回复(11)

16,471

社区成员

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

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

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