.exe也可以有输出函数,可是在dll中正确的输出函数,在.exe中却执行报错了;两者实现时,有什么区别要注意么?
如题 问题点数: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




