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;

}

 

然后运行:

clip_image001

 

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

 

查了下进程列表,木有ExeLibrary.exe

再查调试环境的模块列表:

clip_image002

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;

}

 

运行结果:

 

clip_image003

 

同刚才一样,一切正常。

 

结论

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

 

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

posted on 2012-12-01 11:41  溪流  阅读(84)  评论(0编辑  收藏  举报