使用运行时dll加载时,vc ++可以在库中共享静态

时间:2016-07-01 12:06:50

标签: c++ windows visual-c++ dll dllexport

我正在调查使用Microsoft C ++的插件类型系统。我遇到的问题是我无法在主程序和插件库之间的共享库中共享静态变量。

主程序:

#include "stdafx.h"
#include "windows.h"
#include "..\EngineLib\Engine.h"

typedef void(*PluginFuncPtrType)(void);

int main()
{
    printf("Main Test.\n");

    HINSTANCE hRuntimeDll = LoadLibrary(L"PluginLib.dll");
    if (!hRuntimeDll) {
        printf("Could not load the dynamic library.\n");
    }

    PluginFuncPtrType pluginFuncPtr = (PluginFuncPtrType)GetProcAddress(hRuntimeDll, "PluginFunc");
    if (!pluginFuncPtr) {
        printf("Could not load the function from dynamic library.\n");
    }
    else {
        pluginFuncPtr();
        printf("Main engine counter %i.\n", EngineFunc());
        pluginFuncPtr();
        printf("Main engine counter %i.\n", EngineFunc());
        pluginFuncPtr();
        printf("Main engine counter %i.\n", EngineFunc());
    }

    printf("Press any key to exit...");
    getchar();
}

主程序(静态链接)和插件dll(在此共享库中也静态链接)使用的共享库

共享库标题(Engine.h):

#pragma once
#include <stdio.h>
int EngineFunc();

共享库实施:

#include "stdafx.h"
#include "Engine.h"
#include <stdio.h>

static int _engineCounter = 1;

int EngineFunc()
{
    return _engineCounter++;
}

插件dll标头(Plugin.h):

#pragma once

#include "stdafx.h"
#include <stdio.h>
#include "..\EngineLib\Engine.h"

extern "C" __declspec(dllexport) void PluginFunc(void);

插件实施:

#include "Plugin.h"

void PluginFunc(void)
{
    printf("PluginFunc engine counter=%i\n", EngineFunc());
}

main.exe的输出:

Main Test.
PluginFunc engine counter=1
Main engine counter 1.
PluginFunc engine counter=2
Main engine counter 2.
PluginFunc engine counter=3
Main engine counter 3.
Press any key to exit...

Main.exe 静态链接 EngineLib.lib PluginLib.dll 静态链接 EngineLib.lib

Main不会链接到PluginLib.dll,而是在运行时加载它。

根据我的理解,当在运行时使用LoadLibrary加载dll时,它获得它自己的虚拟内存地址空间,因此不同的静态变量与静态链接到主程序的同一个库。我相信Linux动态加载的库确实共享相同的虚拟内存空间。

我的问题是我是否可以使用任何方法让Windows允许动态加载的dll使用与静态链接库相同的静态变量?

1 个答案:

答案 0 :(得分:0)

创建一个dll。 “EngineStatics.dll”。在此dll中定义静态,并使用__declspec(dllexport)将其导出。

在你的exe中,添加对上面的dll的依赖。并使用__declspec(dllimport)声明相同的静态。

在你的插件dll中,在同一个dll上添加依赖项,并使用delcspec(dllimport)导入它

这似乎比我直接从.exe导出静态,将工具同步到生成导出库,然后使插件dll链接到EXE的lib文件的原始答案要简单得多。