C 共享内存段dll单独加载其实例

C 共享内存段dll单独加载其实例,c,dll,shared-libraries,sierrachart,C,Dll,Shared Libraries,Sierrachart,我有两个.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] =

我有两个.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")
当第一个(或唯一一个)数组索引是通道时,它最多允许20个独立对(发送方-侦听方)。在每个变量中都存在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]++;
}
但是,当我试图设置数据时,出现了我的问题(正常),并且,从第二个实例(即“侦听”模式(它必须主动调用getter,但此时无所谓)获取数据时,我接收到零或初始化为的值,没有任何更改。

非常详细的调试日志很好地演示了这一点:

发送实例对其通道上设置的整个变量进行任务重置(置零),然后设置一些高值(高值和高计数)和低值,然后设置一个标志,表示所有发送的数据已完成

日志看起来正常,在我尝试调用其getter时也是如此(例如,HStack-tip:getter-value,Lows:getter-value):

但是,当我尝试获取相同的数据时(正如我从共享段库中期望的那样),我只接收到零,或者(正如我尝试的那样)第一次初始化的值,正如log所说:

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);
.
.
.
有谁能告诉我怎么了吗?非常感谢


重要提示:这种库我很早就用过,设置者/获取者较少,而且运行良好,尽可能地处理数据,我很高兴,但是发生了一些事情,我无法找到原因和原因,我担心第二天它会解决!!dll的变量在其函数调用、执行任务和卸载时不是持久的


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

解决了!!dll的变量在其函数调用、执行任务和卸载时不是持久的

通过编辑这篇文章,可以找到解决方案的整个研究都将在这里,我现在没有足够的时间来描述它

    #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);
.
.
.