首页 / 技术类 / 调研 / EXE导出函数

EXE导出函数

2012-12-01 11:41:00

突然想到个问题,EXE可否像DLL一样导出函数呢?于是就起来做试验——

静态链接调用

嗯,先建立一个EXE,内容很简单:

 1#include "stdafx.h"
 2#define EXE_LIBRARY
 3#include "ExeLibrary.h"
 4
 5EXE_LIBRARY_API int Sum(int a, int b)
 6{
 7    return a + b;
 8}
 9
10int APIENTRY _tWinMain(_In_ HINSTANCE     hInstance,
11                       _In_opt_ HINSTANCE hPrevInstance,
12                       _In_ LPTSTR        lpCmdLine,
13                       _In_ int           nCmdShow)
14{
15    return 0;
16}

Sum函数是等下用来测试的。其中ExeLibrary.h 中模仿系统生成的DLL头文件进行了宏定义:

1#ifdef EXE_LIBRARY
2#define EXE_LIBRARY_API __declspec(dllexport)
3#else
4#define EXE_LIBRARY_API __declspec(dllimport)
5#endif
6
7EXE_LIBRARY_API int Sum(int a, int b);

然后建立另一个EXE:

1#include "../ExeLibrary/ExeLibrary.h"
2#pragma comment(lib, "ExeLibrary.lib")
3
4int main()
5{
6    int s = Sum(1, 2);
7
8    return s;
9}

然后运行:

能跑,运行结果也正确,说明函数被正确执行。

查了下进程列表,木有ExeLibrary.exe。 再查调试环境的模块列表:

ExeLibrary赫然在目。

整个运行过程中,WinMain 函数木有进入。尝试

动态加载调用

先为刚才的ExeLibrary添加一个def文件:

1LIBRARY
2
3EXPORTS
4    Sum

然后新建另一个EXE:

 1#include <Windows.h>
 2#include <tchar.h>
 3
 4int main()
 5{
 6    HMODULE hModule = LoadLibrary(_T("ExeLibrary.exe"));
 7
 8    if (hModule == nullptr)
 9    {
10        return 0;
11    }
12
13    typedef int (*FnSum)(int a, int b);
14    FnSum Sum = (FnSum)GetProcAddress(hModule, "Sum");
15
16    int s = 0;
17
18    if (Sum != nullptr)
19    {
20        s = Sum(1, 2);
21    }
22
23    FreeLibrary(hModule);
24
25    return s;
26}

运行结果:

同刚才一样,一切正常。

结论

可以像DLL一样,在EXE里导出函数。调用时可以静态链接也可以动态加载。EXE只作为一个进程内的模块被加载,不会新起一个进程。加载过程中EXE中的WinMain函数不会被调用。

例程下载:http://pan.baidu.com/s/1mgqTYBI


首发:http://www.cppblog.com/Streamlet/archive/2012/12/01/195858.html



NoteIsSite/0.4