Как прочитать SharedMemory Mapped File как разные типы данных на стороне c ++ - PullRequest
0 голосов
/ 28 января 2019

@ Прежде всего, извините, если форматирование кода не работает, это моя первая попытка ...

Я устанавливаю межпроцессное взаимодействие между приложением C # WPF и C ++DLL (которая используется сторонним приложением).Сообщение должно использоваться для передачи нескольких различных основных типов данных (bool, (u) integer, float, double, string).Поэтому я планировал использовать MemoryMappedFile в качестве поля неопределенных данных с размером, который соответствует моему объему данных.Я читаю в конфигурации с обеих сторон, используя один и тот же ConfigFile, а затем сохраняю свои байтовые смещения от другой переменной.например,

//bool1 => memory[0]
//int1 => memory[1]
//float1 => memory[5]
//double1 => memory[9]
//int2 => memory[17] and so on...

Но я не могу переосмыслить значения на стороне c ++ без получения исключений.

Само соединение SharedMemory работает правильно.Я отправлял данные с каждой стороны на другую.И если я заполняю byte [] на c # sid 1 в каждом поле, я могу распечатать весь буфер на стороне c ++ в виде символов и увидеть SOH (ascii 0x01) для каждого поля.

// read the MapViewOfFile ... works
auto buffer = (char*) MapViewOfFile(this->shm_handle, 
FILE_MAP_READ, 0, 0, this->shm_field_size);


//interpret as std::string and print out 
//makes a bunch of SOH SOH... in my logfile
std::string incomingPayload(buffer);
_HEILOG(incomingPayload);


//this line throws an exception (I´m not able to catch it)
int tmp_int = *reinterpret_cast<int*>(buffer, 0);
_HEILOG("field as int" << tmp_int);

// this block throws also an unknown exception...
void* v = (void*)buffer[0];int* ip = (int*)v;
int testi = *ip; 
_HEILOG("field as int2" << testi );

Я ожидал, что обе попытки будут работать, так как я ожидал, что смогу перемещаться по полю памяти с помощью buffer[offset] (например, buffer[0], buffer[1], buffer[5] ... для приведенного выше примера).

А затем сделайте реинтерпретацию предстоящих байтов, чтобы считать данные как bool, int, float или как угодно.Но мое стороннее приложение выдает неизвестные исключения, и мой лог-файл не содержит записей.

Я благодарен за каждую подсказку.

С наилучшими пожеланиями SU52

Редактировать: После помощи Селвинса я получил свою главную ошибку, указав значение char [] вместо адреса char [].

Теперь у меня все еще есть проблемы с чтением двойного значения:

/*
Double 355664.12 as binary in C#
Byte No[13] => 174 as Binary: 10101110
Byte No[14] => 71  as Binary: 01000111
Byte No[15] => 225 as Binary: 11100001
Byte No[16] => 122 as Binary: 01111010
Byte No[17] => 64  as Binary: 01000000
Byte No[18] => 181 as Binary: 10110101
Byte No[19] => 21  as Binary: 00010101
Byte No[20] => 65  as Binary: 01000001
*/
char doublefield[] = {  BYTE(1010,1110),
                            BYTE(0100,0111),
                            BYTE(1110,0001),
                            BYTE(0111,1010),
                            BYTE(0100,0000),
                            BYTE(1011,0101),
                            BYTE(0001,0101),
                            BYTE(0100,0001)
    };

double *double_p = reinterpret_cast<double*>(&doublefield[0]);
std::cout << double_p[0] << std::endl; //355664 missing decimals

приводит к отсутствию десятичных разрядов.

Я безуспешно пытался переключить 4 HiBytes на 4 LoBytes.

У кого-нибудь есть идея, где теряются десятичные дроби?BR

...