【发布时间】:2015-09-17 16:56:40
【问题描述】:
我有两个 .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 提示: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 较少,并且运行良好,可以处理数据,我很高兴,但是发生了一些事情,我无法找到什么和原因,我担心它其次天
【问题讨论】:
标签: c dll shared-libraries sierrachart