gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:10:55 31 4
gpt4 key购买 nike

我有两个 .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 个独立对(发送者-监听者)。每个变量中都存在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,但此时并不重要) )为了获得它,我收到零或初始化为的值,没有任何更改。

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

发送实例对其 channel 上的整个变量集进行任务重置(置零),然后放置一些高位(高位值和高位计数)以及低位,然后设置一个标志,表示所有已发送的数据,并且是完成。

日志看起来不错,当我尝试调用它的 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);
.
.
.

谁能告诉我出了什么问题吗?非常感谢

附注重要提示:我很早就使用了这种库, setter / getter 较少,并且运行良好,可以处理数据,我很高兴,但是发生了一些事情,我无法找到发生了什么以及为什么,我其次担心它日

最佳答案

解决了!! DLL 的变量在其函数被调用、执行其工作并卸载时不是持久的。

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

关于c - 共享内存段dll单独加载其实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32635945/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com