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