我的dll会在未经我同意的情况下导出所有功能!

时间:2011-02-18 10:46:41

标签: c dll dllexport

我正在使用mingw编译器和代码块IDE。我正面临一个问题,我不明白我的dll如何在没有我的情况下导出所有函数,甚至使用__declspec(dllexport)这些函数。以下是两个示例文件main.hmain.cpp

main.h

#ifndef __MAIN_H__
#define __MAIN_H__
#include windows.h

#ifdef BUILD_DLL
    #define DLL_EXPORT __declspec(dllexport)
#else
    #define DLL_EXPORT __declspec(dllimport)
#endif

#ifdef __cplusplus
extern "C"
{
#endif

void SomeFunction(const LPCSTR sometext);

#ifdef __cplusplus
}
#endif

#endif // __MAIN_H__

main.cpp

#include "main.h"


void SomeFunction(const LPCSTR sometext)
{
    MessageBoxA(0, sometext, "DLL fxn Message", MB_OK | MB_ICONINFORMATION);
}

bool flag = false;

extern "C" BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    switch (fdwReason)
    {
        case DLL_PROCESS_ATTACH:
            // attach to process
            // return FALSE to fail DLL load
            break;
        case DLL_PROCESS_DETACH:
            // detach from process
            break;
        case DLL_THREAD_ATTACH:
            // attach to thread
            break;
        case DLL_THREAD_DETACH:
            // detach from thread
            break;
    }

    flag = true;

    return TRUE; // succesful
}

在此示例中,SomeFunction已导出,我可以从外部动态调用它,但我没有将其原型化为

void __declspec(dllexport) SomeFunction(const LPSTR sometext);

不仅如此,即使全局变量flag也会在自动生成的.def文件中导出。

这里发生了什么?如果我犯了技术错误,请帮助并纠正我。

2 个答案:

答案 0 :(得分:3)

MinGW链接器将所有符号设为公共,除非您默认隐藏它们。这可以从GCC手册页覆盖:

-fvisibility=default|internal|hidden|protected

...
 A good explanation of the benefits offered by ensuring ELF symbols
           have the correct visibility is given by "How To Write Shared
           Libraries" by Ulrich Drepper (which can be found at
           <http://people.redhat.com/~drepper/>)---however a superior solution
           made possible by this option to marking things hidden when the
           default is public is to make the default hidden and mark things
           public.  This is the norm with DLL's on Windows and with
           -fvisibility=hidden and "__attribute__ ((visibility("default")))"
           instead of "__declspec(dllexport)" you get almost identical
           semantics with identical syntax.  This is a great boon to those
           working with cross-platform projects.

答案 1 :(得分:0)

我不知道MinGW链接器或CodeBlocks,但是可以导出函数的另一种方式是通过.def文件。你有一个.def文件列出了你传递给链接器的SomeFunction吗?

(这看起来像VC ++ DLL模板,IIRC包含带有这些导出的.def文件)