CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  进程/线程/DLL

.exe也可以有输出函数,可是在dll中正确的输出函数,在.exe中却执行报错了;两者实现时,有什么区别要注意么?

楼主tohell(游游)2005-08-01 13:52:05 在 VC/MFC / 进程/线程/DLL 提问

如题 问题点数:30、回复次数:16Top

1 楼qrlvls( 空 气 )回复于 2005-08-01 14:26:57 得分 0

注意输出函数的调用约定是否相同Top

2 楼tohell(游游)回复于 2005-08-01 14:45:59 得分 0

 
    调用约定当然相同!我的意思是   把.exe当dll用,在.exe中实现输出函数   给其他的.exe调用。Top

3 楼tohell(游游)回复于 2005-08-04 15:06:14 得分 0

 
        顶一下。   注:是在vc7.0下编译的。Top

4 楼idAnts(此广告位招租)回复于 2005-08-04 15:09:41 得分 0

报什么错了?Top

5 楼idAnts(此广告位招租)回复于 2005-08-04 15:10:31 得分 0

要在同一进程空间内Top

6 楼tohell(游游)回复于 2005-08-04 15:31:43 得分 0

 
    难道loadlibraly("oth.exe")     不能将另一个可执行文件包含到   进程空间来么?Top

7 楼Areslee(懒虫易水)回复于 2005-08-04 17:37:57 得分 0

不能Top

8 楼tohell(游游)回复于 2005-08-05 09:40:17 得分 0

 
    但我以前用delphi   调用过   .exe的输出函数啊   ,   vc下没办法做到么?Top

9 楼netgm(问题多多)回复于 2005-08-05 11:04:18 得分 2

如果delphi能做到.那就是你在VC上的方法问题了..  
  帮你顶Top

10 楼idAnts(此广告位招租)回复于 2005-08-05 11:10:52 得分 25

是可以的。如果你导出一个不调用api的函数,正常使用肯定没有问题。  
   
  但是在调用一个两个程序本身都用的api的导出函数的时候会有问题。比如导出一个函数:  
  void   mymessage()  
  {  
        MessageBox(NULL,"dsfj","skdf",MB_OK);  
  }  
  你在另外一个exe里调这个会有问题。我猜测原因是messagebox的地址在编译的时候分别被写在了两个exe的导入表中,在导出函数的exe中再调用messagebox的时候,这个地址实际上已经不是messagebox的正确地址了,导致了错误。但是如果该exe是用GetProcAddress来取得messagebox的地址调用的话,应该是没有问题。Top

11 楼seansoe(www.sysmgmt.com.cn)回复于 2005-08-05 11:52:47 得分 0

markTop

12 楼sboom(+-LingCh-+)(爱美人不爱VC)回复于 2005-08-05 12:38:16 得分 1

编译的时候怎么会写导入表呢?编译时都还不知道kernel.dll的地址,加载的时候才写导入表的吧。Top

13 楼idAnts(此广告位招租)回复于 2005-08-05 13:18:18 得分 0

在导入表里的RVA地址,比如说a.exe里的messagebox的RVA是0000509C,基址是00400000,那a.exe里调用MessageBox其实就是Call   dword   ptr   [0040509C]  
   
  在两个exe里,这个地址是不一样的。所以就call错了。Top

14 楼nelsonc(软件兔)回复于 2005-08-05 13:22:52 得分 2

不要再exe中使用输出函数,因为exe和dll的入口函数是不一样的,也就是在编译的时候VC++给exe和dll使用的进入函数不同。如果用LoadLibrary装入exe的话,入口函数执行会出问题。  
  简单说,就是WinMain和DllMain的不同啦。  
  所以想在exe中再装入exe是不对的设计。Top

15 楼idAnts(此广告位招租)回复于 2005-08-05 13:43:24 得分 0

编译器可以设定exe的基址,如果能保证这个地址和加载以后的地址一致的话,当然不可能是400000这个地址了,因为一般你调用的程序默认是这个地址,应该也就可以调用了。  
   
  这个未经证实。Top

16 楼xiaonian_3654(你猜猜(我要打光棍,小乔嫁不了))回复于 2005-08-05 13:48:56 得分 0

二者都动态连接CRT运行库  
   
  我想你的程序应该是,1个申请内存,在另一个释放内存。Top

相关问题

  • 查看DLL的输出函数
  • dll中输出函数名的问题
  • vb做的dll如何输出函数?
  • CList作为dll的输出函数的一个参数传入,在输出函数中申请节点的空间,可不可以?为什么我的在外面使用节点报错?
  • 关于Dll的函数名,如何输出我想要的函数名
  • dll输出的函数名称不能改变吗?
  • ?????一个MFC扩展DLL中的输出函数的问题????
  • 如何调用DLL,并使用其中的输出函数?
  • 关于Extension DLL输出函数的问题
  • DLL输出函数不能传递参数?

关键词

  • 函数
  • 编译
  • 执行
  • vc
  • dll
  • 调用
  • 地址
  • 输出
  • 导出
  • messagebox

得分解答快速导航

  • 帖主:tohell
  • netgm
  • idAnts
  • sboom
  • nelsonc

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo