共享内存段dll分别加载其实例

时间:2015-09-17 16:56:40

标签: c dll shared-libraries

我有两个.dll,其中一个必须在两个或多个显式加载的实例之间交换数据。其中第二个具有来自具有共享内存段的库的发送模式和监听模式。

如下所示:

#pragma data_seg("sh")

float Highs[20][100] = {0};
float Lows[20][100] = {0};
int HighCount[20][100] = {0};
int LowCount[20][100] = {0};
int HStackTip[20] = {0};
int LStackTip[20] = {0};
float AloneHighs[20][100] = {0};
float AloneLows[20][100] = {0};
int AloneHighCount[20][100] = {0};
int AloneLowCount[20][100] = {0};
BOOL isCompletelySent[20] = {FALSE};

#pragma data_seg()
#pragma comment(linker, "/SECTION:sh,RWS")

如果第一个(或唯一的)数组索引是channel,它最多允许20个独立的对(sender-listener)。在每个变量中都存在setter和getter,就像这样

    extern "C" __declspec(dllexport) void __stdcall SetDataSendingFinished(int channel)
{
    isCompletelySent[channel] = 1;
}
extern "C" __declspec(dllexport) BOOL __stdcall IsDataComplete(int channel)
{
    return isCompletelySent[channel];
}
extern "C" __declspec(dllexport) void __stdcall SetHigh(int channel, float value, int count)
{
    Highs[channel][HStackTip[channel]] = value;
    HighCount[channel][HStackTip[channel]] = count;
    AloneHighs[channel][HStackTip[channel]] = value;
    AloneHighCount[channel][HStackTip[channel]] = count;
    HStackTip[channel]++;
}

但是,当我尝试设置数据时,我的问题出现了(确定),并且从第二个实例开始,这是" listen"模式(它必须主动调用getter,但此时无关紧要)获取它,我收到零或初始化为的值,没有任何变化。

我的调试非常详细的日志证明了这一点:

发送实例在其通道上的整个变量集上有一个任务重置(置零),然后放置一些高(高值和高值计数),以及低点,然后设置一个标志信号通知所有发送的数据,并且完整。

日志看起来没问题,如果我尝试调用它的getter(HStack提示:getter值,Lows:getter值,例如):

Chart:  #2 | Study: PrecHLCD | Library on channel 0 reset. HStack tip: 0 | 2015-09-17  16:31:03
Chart:  #2 | Study: PrecHLCD | High set | 2015-09-17  16:31:03
Chart:  #2 | Study: PrecHLCD | Low set | 2015-09-17  16:31:03
Chart:  #2 | Study: PrecHLCD | Finish flag set: 1. Stack tips Lows: 1, Highs: 1 | 2015-09-17  16:31:03

但是,当我尝试获取相同的数据时(正如我期望从共享段库那样),我只记得零,或者(我试过)首先初始化值,如日志所说:

Chart:  #1 | Study: PrecHLCD | loop. On channel 0 data sending status: 0 (HST 0, LST 0) | 2015-09-17  16:31:26

共享库中的函数通常导入:

    #pragma comment(lib, "C:\\SierraChart\\Data\\IntercomSingleton.lib")

    extern "C" __declspec(dllimport) void __stdcall SetHigh(int channel, float value, int count);
    extern "C" __declspec(dllimport) void __stdcall SetLow(int channel, float value, int count);
    extern "C" __declspec(dllimport) void __stdcall ResetLibrary(int channel);
    extern "C" __declspec(dllimport) int __stdcall BroadcastedHighs(int channel, float value);
.
.
.

你能告诉我什么错了吗?非常感谢

P.S。重要说明:这种我早期使用的库,设置器/读取器较少,工作得很好,可能会处理数据,我很高兴,但有些事情发生了,我无法找到什么和为什么,我担心第二天

1 个答案:

答案 0 :(得分:0)

解决!! dll的变量在被调用的函数执行和卸载时都不是持久的。

导致解决方案的整个研究将在这里编辑这篇文章,我没有足够的时间来描述它。