Hi,
Your issue is related to data structure alignment and padding. See https://stackoverflow.com/questions/119123/why-isnt-sizeof-for-a-struct-equal-to-the-sum-of-sizeof-of-each-member
By default, C/C++ compilers add padding to structs to improve memory alignment. However, LabVIEW does not add padding to clusters. So, in your DLL, the structs' memory layout is probably like this:
struct Signal
{
uint32 nStartBit; // 4 bytes
uint32 nLen; // 4 bytes
double nFactor; // 8 bytes
double nOffset; // 8 bytes
double nMin; // 8 bytes
double nMax; // 8 bytes
double nValue; // 8 bytes
uint64 nRawValue; // 8 bytes
bool is_signed; // 1 byte
char unit[11]; // 11 bytes
char strName[66]; // 66 bytes
char strComment[201]; // 201 bytes
// 1 byte (PADDING)
}; // TOTAL: 336 bytes
struct Message
{
uint32 nSignalCount; // 4 bytes
uint32 nID; // 4 bytes
uint8 nExtend; // 1 byte
// 3 bytes (PADDING)
uint32 nSize; // 4 bytes
Signal vSignals[513]; // 172368 bytes (=513*336 bytes)
char strName[66]; // 66 bytes
char strComment[201]; // 201 bytes
// 5 bytes (PADDING)
}; // TOTAL: 172656 bytes
There are two ways you can make your structs and clusters compatible:
If you control the DLL source code and you can compile the DLL yourself, then you can update your code to pack the structs.
If your compiler is Visual Studio, add #pragma pack(): https://msdn.microsoft.com/en-us/library/2e70t5y1.aspx
If your compiler is MinGW, add __attribute__((__packed__)): https://stackoverflow.com/a/4306269/1144539
If you cannot compile the DLL yourself or if you don't want to change the DLL, then you can add padding to your LabVIEW clusters.
Signal: Add 1 byte (U8) to the end of the cluster
Message: Add 3 bytes in between nExtend and nSize. Add 5 bytes to the end of the cluster.
I must say, the Message struct is huge! (>170 KiB)