| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1830 人关注过本帖
标题:一般建立com组件都是用atl oroject嘛?
取消只看楼主 加入收藏
liuxuer
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2005-4-22
收藏
 问题点数:0 回复次数:6 
一般建立com组件都是用atl oroject嘛?
一般建立com组件都是用atl oroject嘛?

另外,
我按照一个网上的历程按,先建立一个win32 dll project,然后添加其IDL文件至项目中(IDL文件中定义了 ISimpleMath 和 IAdvancedMath ),然后编译,没有错误,生成了需要的几个文件.h,_i.c,_i.p等,然后我再加入两个文件Math.h 和 Math.cpp 到项目中,里面定义CMath继承ISimpleMath  和 IAdvancedMath,且包含了idl编译生成的头文件和_i.c文件, 但是编译产生很多这样的错误 :
F:\workspace\MathCOM\math.cpp(23) : error C2653: 'CMath' : is not a class or namespace name

比如在这一行,STDMETHODIMP_(ULONG)CMath::AddRef(),其他都类似
不知道是为什么?
搜索更多相关主题的帖子: atl oroject 组件 
2005-04-28 09:53
liuxuer
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2005-4-22
收藏
得分:0 
to 姬老师 : 你是说除了math.h里面的定义idl文件里面还要定义嘛? 我的idl文件如下
// MathCOM.idl : IDL source for MathCOM.dll
// This file will be processed by the MIDL tool to
// produce the type library (MathCOM.tlb) and marshalling code.
import "oaidl.idl";
import "ocidl.idl";
               [
                               uuid(FAEAE6B7-67BE-42a4-A318-3256781E945A),
                               helpstring("ISimpleMath Interface"),
                               object,
                               pointer_default(unique)
               ]
               interface ISimpleMath : IUnknown
               {
                               HRESULT Add([in]int nOp1,[in]int nOp2,[out,retval]int * pret);
                               HRESULT Subtract([in]int nOp1,[in]int nOp2,[out,retval]int * pret);
                               HRESULT Multiply([in]int nOp1,[in]int nOp2,[out,retval] int * pret);
                               HRESULT Divide([in]int nOp1,[in]int nOp2,[out,retval]int * pret);
               };
 
               [
                               uuid(01147C39-9DA0-4f7f-B525-D129745AAD1E),
                               helpstring("IAdvancedMath Interface"),
                               object,
                               pointer_default(unique)
               ]
               interface IAdvancedMath : IUnknown
               {
                               HRESULT Factorial([in]int nOp1,[out,retval]int * pret);
                               HRESULT Fabonacci([in]int nOp1,[out,retval]int * pret);
               };
[
               uuid(CA3B37EA-E44A-49b8-9729-6E9222CAE844),
               version(1.0),
               helpstring("MATHCOM 1.0 Type Library")
]
library MATHCOMLib
{
               importlib("stdole32.tlb");
               importlib("stdole2.tlb");
 
               [
                               uuid(3BCFE27E-C88D-453C-8C94-F5F7B97E7841),
                               helpstring("MATHCOM Class")
               ]
               coclass MATHCOM
               {
                               [default] interface ISimpleMath;
                               interface IAdvancedMath;
               };
};
如果需要加,应该怎么加呢? 我要实现上面的目的怎么利用 vc 的向导直接达成呢 ? 就是一个c++实现类继承两个接口, 我试建立atl com项目,然后new atl ogject ,虽然选了dual双接口,但是每次其实生成的是一个接口类和一个对应的实现类, 很是苦恼...
2005-04-28 16:39
liuxuer
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2005-4-22
收藏
得分:0 
我是这样写的 ,  至少框架是一样的 ,  已经发给你了邮件 ,帮忙看看
2005-04-29 14:02
liuxuer
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2005-4-22
收藏
得分:0 
我改掉两个错误,
#include "stdafx.h"要放在最前面
另外,文件math.h后面加上#end if
现在没有上面F:\workspace\MathCOM\math.cpp(23) : error C2653: 'CMath' : is not a class or namespace name的错误了,
好像是个小问题,
STDMETHODIMP CMath::QueryInterface(REFIID riid,void **ppv)
{
 if(riid==IID_ISimpleMath)
  *ppv = static_cast(this);        //error
 else if(riid==IID_IAdvancedMath)
  *ppv = static_cast(this);         //error
 else if(riid==IID_IUnknown)
  *ppv = static_cast(this);          //error
 else {
  *ppv = 0;
  return E_NOINTERFACE;
 }
reinterpret_cast(*ppv)->AddRef();//error

在上面四行出现这样的错误,F:\workspace\MathCOM\math.cpp(7) : error C2059: syntax error : '('
应该是跟这个static_cast和reinterpret_cast函数调用有关的,现在还没调出来,继续努力
2005-04-29 21:33
liuxuer
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2005-4-22
收藏
得分:0 
改好了,编译没错误了,又有连接错误了,唉`
2005-04-29 21:45
liuxuer
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2005-4-22
收藏
得分:0 
math.obj : error LNK2001: unresolved external symbol _IID_IAdvancedMath
math.obj : error LNK2001: unresolved external symbol _IID_ISimpleMath

why?
2005-04-29 21:49
liuxuer
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2005-4-22
收藏
得分:0 
谢谢姬老师~~~
2005-04-29 21:52
快速回复:一般建立com组件都是用atl oroject嘛?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016967 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved