怎么用exe调用另一个exe里函数,像调用dll那样

pass2000123 2010-07-06 10:56:56
如题,现在有需要像调用dll里的函数那样调用一个exe里面的函数,不知道该怎么做,有些人说可以像DLL那样调用,有些人说不可以,我也调试了 LoadLibaryEx("a.exe",null,**AS_FILEDATA)也照网上那样写了,好像这一步好了,但下面获取函数地址的时候又是空地址。
所以请各位大侠指教下。
最好有个详细的例子,多谢
...全文
1070 36 打赏 收藏 转发到动态 举报
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
YFLK 2010-09-09
  • 打赏
  • 举报
回复
EXE中是可以有导出表的,只是大多数情况下不需要这么做。
在EXE中就是有导出表,在其它EXE中调用另一个EXE中的函数也有很多问题,在看雪上有这方面的帖子。
zhangxuyu1118 2010-09-03
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 zheyimiao 的回复:]

使用COM技术可以做到!把需要调用的exe封装成COM组件,然后再客户端调。具体的要参加COM原理了,涉及到的东西比较多
[/Quote]支持这个。
10楼是激发EXE而已。EXE中的接口怎样去实现,WINDOWS下你要去看COM原理。

rocsoft 2010-09-01
  • 打赏
  • 举报
回复
10楼以及说10楼正解的人都在浪费国家粮食。
cswuyg 2010-07-17
  • 打赏
  • 举报
回复
10楼的答非所问。WinExec和ShellExecute的目的是用于执行另一个可执行文件,类似于新建一个进程。


调用exe里的函数,没法直接做到。因为DLL有导出表、重定位表,而exe没有导出表,而且有的exe没有重定位表。
如果没有重定位表那什么都做不了,因为如果原exe文件中有直接寻址的指令,没有重定位表就无法修改,寻址的结果是错误的。
如果有重定位表,应该可以做到,获取要导出的函数的rva地址,新建导出表,把exe改为dll。网上可以搜索到资料。
arong1234 2010-07-17
  • 打赏
  • 举报
回复
我想一般人说“调用”的时候不是用这种反向工程这么复杂而麻烦的方法,而是说基本机制上是否可能。[Quote=引用 31 楼 skyworth98 的回复:]
还是有办法的,用调试器什么的找到函数地址,分析出参数类型及调用约定,总之是麻烦得很


引用 29 楼 arong1234 的回复:
如果你是使用现有的一个别人编写的exe,希望重用它的函数,我估计这基本是不可能的。如果这可以实现的,也必须要原来exe的作者做一些特别处理的(如使用dllexport把函数放入导出表),而我估计几乎没有一个程序员会做这个。

如果是你自己的一个exe,也……
[/Quote]
skyworth98 2010-07-17
  • 打赏
  • 举报
回复
还是有办法的,用调试器什么的找到函数地址,分析出参数类型及调用约定,总之是麻烦得很

[Quote=引用 29 楼 arong1234 的回复:]
如果你是使用现有的一个别人编写的exe,希望重用它的函数,我估计这基本是不可能的。如果这可以实现的,也必须要原来exe的作者做一些特别处理的(如使用dllexport把函数放入导出表),而我估计几乎没有一个程序员会做这个。

如果是你自己的一个exe,也许可能,但是估计没有什么人这么用。把你的代码抽出来,单独编译成dll,然后让你的exe和其他程序都用这个dll,这才是标准的方法。
[/Quote]
skyworth98 2010-07-17
  • 打赏
  • 举报
回复
也就是说,需要导出你想要被外部调用的函数


[Quote=引用 20 楼 johnroot 的回复:]
在EXE程序里把要被外部调用的函数 okok 定义成这样:
extern "C" __declspec(dllexport) bool okok(int rrr)
{
return false;
}

其它程序调用这个函数就可以像调用DLL一样的调用了
[/Quote]
arong1234 2010-07-17
  • 打赏
  • 举报
回复
如果你是使用现有的一个别人编写的exe,希望重用它的函数,我估计这基本是不可能的。如果这可以实现的,也必须要原来exe的作者做一些特别处理的(如使用dllexport把函数放入导出表),而我估计几乎没有一个程序员会做这个。

如果是你自己的一个exe,也许可能,但是估计没有什么人这么用。把你的代码抽出来,单独编译成dll,然后让你的exe和其他程序都用这个dll,这才是标准的方法。
清雨小竹 2010-07-17
  • 打赏
  • 举报
回复
没听说过
aizibion 2010-07-17
  • 打赏
  • 举报
回复
为什么非要调用其他exe里面的函数?既然这部分函数在多个exe都会使用,就是告诉你,是该把这些函数提出来封装为dll的时候了。

当然,如果楼主只是研究研究,就鄙人所知,尚不能解答。
qiutian1949 2010-07-17
  • 打赏
  • 举报
回复
10楼的正解,我也是这么实现的
T0Ols 2010-07-17
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
//声明一个程序信息类
System.Diagnostics.ProcessStartInfo Info = new System.Diagnostics.ProcessStartInfo();

//设置外部程序名
Info.FileName = "anotherApplication.exe";

//设置外部程序工作目录为 该应用程序的同级目录下(Debuge)
Info.WorkingDirectory = System.Environment.CurrentDirectory;

//声明一个程序类
System.Diagnostics.Process Proc;

try
{
//启动外部程序
Proc = System.Diagnostics.Process.Start(Info);
}
catch (System.ComponentModel.Win32Exception e)
{
Console.WriteLine("系统找不到指定的程序文件。\r{0}", e);
return;
}

//打印出外部程序的开始执行时间
Console.WriteLine("外部程序的开始执行时间:{0}", Proc.StartTime);

//等待3秒钟
Proc.WaitForExit(3000);

//如果这个外部程序没有结束运行则对其强行终止
if (!Proc.HasExited)
{
Console.WriteLine("由主程序强行终止外部程序的运行!");
Proc.Kill();
}
else
{
Console.WriteLine("由外部程序正常退出!");
}
Console.WriteLine("外部程序的结束运行时间:{0}", Proc.ExitTime);
Console.WriteLine("外部程序在结束运行时的返回值:{0}", Proc.ExitCode);
}
}
}
ypb362148418 2010-07-16
  • 打赏
  • 举报
回复
直接在第一个exe中给出第二个EXE的路径,然后执行就行了
kingchj 2010-07-16
  • 打赏
  • 举报
回复
exe也可以导出函数,同样用export关键字,编译之后就会生成一个lib。
贪食蛇男 2010-07-16
  • 打赏
  • 举报
回复
EXE和DLL都是标准PE文件,只是大部分EXE无导出表。
你只要给EXE适当的导出表,EXE里函数是可以做为公用函数的。

但是我没这么用过,不知道直接LoadLibrary()行不行……
johnroot 2010-07-16
  • 打赏
  • 举报
回复
就是要被外部调用的函数前加 extern "C" __declspec(dllexport)
johnroot 2010-07-16
  • 打赏
  • 举报
回复
在EXE程序里把要被外部调用的函数 okok 定义成这样:
extern "C" __declspec(dllexport) bool okok(int rrr)
{
return false;
}

其它程序调用这个函数就可以像调用DLL一样的调用了
zheyimiao 2010-07-15
  • 打赏
  • 举报
回复
使用COM技术可以做到!把需要调用的exe封装成COM组件,然后再客户端调。具体的要参加COM原理了,涉及到的东西比较多
gunsand 2010-07-15
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 yzx714 的回复:]
10楼和11楼……
[/Quote]

他们好搞笑。
deviosyan 2010-07-15
  • 打赏
  • 举报
回复
不会,,,等待高人解答 学习
加载更多回复(16)

64,641

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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