COM高手看看?编译方面的问题?

jhyu119 2002-06-27 12:01:05
我先用VC的工程向导生成一个makefile类型的工程,然后加入如下三个人间,生成一个com接口:
IDDE.idl文件如下:----------
// NOTE: no automation declarations--use MFC's built-in support for that
import "unknwn.idl";
[
object,
uuid(F8ABDECC-1F97-4d1c-B578-BB3CE2827EB1),
pointer_default(unique)
]
interface IDDE : IUnknown
{

HRESULT GetTagValue([in] BSTR plArg1, [out] long *plArg2);
HRESULT SetTagValue([in] BSTR plArg1, [in] long plArg2);
HRESULT StartThread();
HRESULT StopThread();
//HRESULT Method2([in] long lArg, [in] unsigned long ulArg);
};

IDDE.def文件如下:-------------

LIBRARY "IDDE"

DESCRIPTION 'Proxy/Stub DLL'

EXPORTS
DllGetClassObject @1 PRIVATE
DllCanUnloadNow @2 PRIVATE
GetProxyDllInfo @3 PRIVATE
DllRegisterServer @4 PRIVATE
DllUnregisterServer @5 PRIVATE


IDDE.mak文件如下:

IFACE = IDDE

$(IFACE).dll: dlldata.obj $(IFACE)_p.obj $(IFACE)_i.obj
link /dll /out:$(IFACE).dll /def:$(IFACE).def /entry:DllMain dlldata.obj $(IFACE)_p.obj \
$(IFACE)_i.obj kernel32.lib rpcndr.lib rpcns4.lib rpcrt4.lib oleaut32.lib uuid.lib
regsvr32 /s $(IFACE).dll

dlldata.c $(IFACE)_p.c $(IFACE)_i.c $(IFACE).h : $(IFACE).idl
midl $(IFACE).idl

.c.obj:
cl /c /Ox /DWIN32 /D_WIN32_WINNT=0x0400 /DREGISTER_PROXY_DLL $<

clean:
@del $(IFACE).dll
@del $(IFACE).lib
@del $(IFACE).exp
@del dlldata.obj
@del $(IFACE)_p.obj
@del $(IFACE)_i.obj
当将上面的IDL文件中的SetTagValue([in] BSTR plArg1, [in] long plArg2);改为
HRESULT SetTagValue([in] BSTR plArg1, [in] float plArg2)时(将long改为float),编译出错如下:


--------------------Configuration: IDDE - Win32 Debug--------------------
Microsoft (R) Program Maintenance Utility Version 6.00.8168.0
Copyright (C) Microsoft Corp 1988-1998. All rights reserved.
midl IDDE.idl
Microsoft (R) MIDL Compiler Version 5.01.0164
Copyright (c) Microsoft Corp 1991-1997. All rights reserved.
Processing .\IDDE.idl
IDDE.idl
Processing C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\unknwn.idl
unknwn.idl
Processing C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\wtypes.idl
wtypes.idl
cl /c /Ox /DWIN32 /D_WIN32_WINNT=0x0400 /DREGISTER_PROXY_DLL dlldata.c
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.
dlldata.c
cl /c /Ox /DWIN32 /D_WIN32_WINNT=0x0400 /DREGISTER_PROXY_DLL IDDE_p.c
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.
IDDE_p.c
cl /c /Ox /DWIN32 /D_WIN32_WINNT=0x0400 /DREGISTER_PROXY_DLL IDDE_i.c
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.
IDDE_i.c
link /dll /out:IDDE.dll /def:IDDE.def /entry:DllMain dlldata.obj IDDE_p.obj IDDE_i.obj kernel32.lib rpcndr.lib rpcns4.lib rpcrt4.lib oleaut32.lib uuid.lib
Microsoft (R) Incremental Linker Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
Creating library IDDE.lib and object IDDE.exp
LIBC.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
IDDE.dll : fatal error LNK1120: 1 unresolved externals
NMAKE : fatal error U1077: 'link' : return code '0x460'
Stop.
Error executing nmake.

IDDE.dll - 3 error(s), 0 warning(s)

有需要此工程的同志请留下邮箱,我会发给你的?
我这样写接口的原因是想用MFC写COM服务器,因为用ATL写的EXE服务器不能支持MFC,而我又要用到DDE和线程之类的东西,所以只有这样?
...全文
23 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ooad 2002-06-28
  • 打赏
  • 举报
回复
哈,我终于找到了,你的link选项里有下面这个参数
/entry:DllMain
可是你的工程里又没有定义这个函数,所以会出错,去掉这个参数就可以了。至于你原来的工程为什么long可以,而改成folat不可以,我就不知道原因了。不过看错误提示,好像是引用了不同的库,你原来的工程我使用double测试也不能成功,但是int、float、char就都可以。
我现在一般使用atl开发com服务器,所以现在mfc开发的细节我也不是很清楚了,我以前接触过一点,你可以看看《vc++6.0技术内幕》,潘爱民翻译的,那里边讲得很多,不过我建议如果开发无界面的服务器还是使用atl比较好,现在也有比较好的书了:<深入解析atl>,也是潘爱民翻译的
jhyu119 2002-06-28
  • 打赏
  • 举报
回复
to ooad:
其实我向EXCEL请求数据,也是举一个例子,我需要我的进程外服务器能够向DDE Server请求数据,所以就采取这种不伦不类的方法。这种方法也是从《com编程精彩实例》中学来的。
根据书上的说法,用mfc写进程外服务器首先要写一个接口服务器,也就是我发送给你的那个工程(主要是三个文件*.mak,*.idl,*.def),生成一个接口。然后用MFC写一个支持Automation的工程(随便是多文档,单文档,对话框),在其中添加一个从CCmdTarg类继承的类,加上类似于下面的代码:
BEGIN_INTERFACE_PART(DDE, IDDE)
STDMETHOD_(HRESULT,GetTagValue)(BSTR, long *);
STDMETHOD_(HRESULT,SetTagValue)(BSTR, long );
END_INTERFACE_PART(DDE)
就表示此类是刚才那个接口的实现。但是这样如果接口里面的函数的参数里面有float类型的话,那么编译就会出现上面我讲的错误!

我现在就是想问问你们怎么用mfc写进程外服务器?
jhyu119 2002-06-28
  • 打赏
  • 举报
回复
to ooad:
其实我向EXCEL请求数据,也是举一个例子,我需要我的进程外服务器能够向DDE Server请求数据,所以就采取这种不伦不类的方法。这种方法也是从《com编程精彩实例》中学来的。
根据书上的说法,用mfc写进程外服务器首先要写一个接口服务器,也就是我发送给你的那个工程(主要是三个文件*.mak,*.idl,*.def),生成一个接口。然后用MFC写一个支持Automation的工程(随便是多文档,单文档,对话框),在其中添加一个从CCmdTarg类继承的类,加上类似于下面的代码:
BEGIN_INTERFACE_PART(DDE, IDDE)
STDMETHOD_(HRESULT,GetTagValue)(BSTR, long *);
STDMETHOD_(HRESULT,SetTagValue)(BSTR, long );
END_INTERFACE_PART(DDE)
就表示此类是刚才那个接口的实现。但是这样如果接口里面的函数的参数里面有float类型的话,那么编译就会出现上面我讲的错误!

我现在就是想问问你们怎么用mfc写进程外服务器?
jhyu119 2002-06-28
  • 打赏
  • 举报
回复
用MFC写一个进程外服务器应该怎么写呀?
ooad 2002-06-28
  • 打赏
  • 举报
回复
我在看你的工程,不过我对你的想法有些疑问,为什么不直接用com向excel取数据呢,我看很多书上都说excel算是微软实现的最好的自动化服务器了呀,不过,我没有用过dde,只在最开始学windows编程的时候看过一点,可以说是一窍不通,对使用dde的优点/缺点如何,还请指教。 :)
jhyu119 2002-06-28
  • 打赏
  • 举报
回复
to ooad:
已经将工程发送给你了,望验收!
jhyu119 2002-06-28
  • 打赏
  • 举报
回复
to ooad:
我是想写一个COM的exe服务器,它通过DDE的方式向另外一个DDE Server(如:Excel)请求数据,然后我得客户端向COM的exe服务器请求数据,所以我想如果用ATL来作这样一个EXE服务器的话,在里面肯定不能用DDE的方式向Excel请求数据,因此我只有用MFC来作exe服务器。
不知道我得想法是否正确,望指教!
ooad 2002-06-28
  • 打赏
  • 举报
回复
呵呵,太客气了,共同提高吗!
================================================================

CSDN 论坛助手 Ver 1.0 B0402提供下载。 改进了很多,功能完备!

★ 浏览帖子速度极快![建议系统使用ie5.5以上]。 ★ 多种帖子实现界面。
★ 保存帖子到本地[html格式]★ 监视您关注帖子的回复更新。
★ 可以直接发贴、回复帖子★ 采用XML接口,可以一次性显示4页帖子,同时支持自定义每次显示帖子数量。可以浏览历史记录!
★ 支持在线检测程序升级情况,可及时获得程序更新的信息。

★★ 签名 ●
可以在您的每个帖子的后面自动加上一个自己设计的签名哟。

Http://www.ChinaOK.net/csdn/csdn.zip
Http://www.ChinaOK.net/csdn/csdn.rar
Http://www.ChinaOK.net/csdn/csdn.exe [自解压]

jhyu119 2002-06-28
  • 打赏
  • 举报
回复
谢谢ooad!
mycode 2002-06-27
  • 打赏
  • 举报
回复
ATL写的EXE服务器不能支持MFC?

在创建时有一个选项,可以支持MFC.
Erlin 2002-06-27
  • 打赏
  • 举报
回复

可以在MSDN里搜索一下_ATL_MIN_CRT的帮助

ooad 2002-06-27
  • 打赏
  • 举报
回复
mfc写com服务器我不是很熟,不过我想不到有能用mfc坐而atl完不成的com服务器,在一个,你如果用com进行客户/服务器编程,为什么还要用到dde呢?此外,就线程的支持而言,mfc绝对不可能比得上atl的啊?
嗯,不过可能也有特殊的情况,你这个工程的错误可能是工程设置有问题,你把工程发给我看看吧,e-mail ooad@yeah.net.

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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