EXE导出函数
突然想到个问题,EXE可否像DLL一样导出函数呢?于是就起来做试验——
静态链接调用
嗯,先建立一个EXE,内容很简单:
#include "stdafx.h" #define EXE_LIBRARY #include "ExeLibrary.h"
EXE_LIBRARY_API int Sum(int a, int b) { return a + b; }
int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPTSTR lpCmdLine, _In_ int nCmdShow) { return 0; } |
Sum函数是等下用来测试的。其中ExeLibrary.h 中模仿系统生成的DLL头文件进行了宏定义:
#ifdef EXE_LIBRARY #define EXE_LIBRARY_API __declspec(dllexport) #else #define EXE_LIBRARY_API __declspec(dllimport) #endif
EXE_LIBRARY_API int Sum(int a, int b);
|
然后建立另一个EXE:
#include "../ExeLibrary/ExeLibrary.h" #pragma comment(lib, "ExeLibrary.lib")
int main() { int s = Sum(1, 2);
return s; } |
然后运行:
能跑,运行结果也正确,说明函数被正确执行。
查了下进程列表,木有ExeLibrary.exe。
再查调试环境的模块列表:
ExeLibrary赫然在目。
整个运行过程中,WinMain 函数木有进入。尝试
动态加载调用
先为刚才的ExeLibrary添加一个def文件:
LIBRARY
EXPORTS Sum |
然后新建另一个EXE:
#include <Windows.h> #include <tchar.h>
int main() { HMODULE hModule = LoadLibrary(_T("ExeLibrary.exe"));
if (hModule == nullptr) { return 0; }
typedef int (*FnSum)(int a, int b); FnSum Sum = (FnSum)GetProcAddress(hModule, "Sum");
int s = 0;
if (Sum != nullptr) { s = Sum(1, 2); }
FreeLibrary(hModule);
return s; } |
运行结果:
同刚才一样,一切正常。
结论
可以像DLL一样,在EXE里导出函数。调用时可以静态链接也可以动态加载。EXE只作为一个进程内的模块被加载,不会新起一个进程。加载过程中EXE中的WinMain函数不会被调用。
例程下载:http://pan.baidu.com/s/1mgqTYBI