C ++ копировать структуру на ресурс другой программы - PullRequest
0 голосов
/ 09 сентября 2018

Я пытаюсь скопировать структуру для чтения другой программой.

Исходная программа:

        struct datas{               
            std::string key;
        };

        datas mystructure = datas();
        std::string mychar = "mychar";// if length of char > 8, it doesn't get copied.

        mystructure.key = mychar;

        WriteToResources(param, 0, (BYTE*)&mystructure, sizeof(mystructure));

Программа-получатель:

struct datas{               
            std::string key;
        };

datas mystructure;
memcpy(&mystructure, pbindata, rsrcsize);

std::cout << (char*)mystructure.key.c_str();

Когда mychar'sдлина <= 8, он копируется в ресурс и отлично читается целевой программой.Однако, если длина mychar> 8, ничего не копируется.

Спасибо за ваше время.

1 Ответ

0 голосов
/ 09 сентября 2018

Сначала , я не рекомендую делать это для производственного кода. Пожалуйста, используйте правильный механизм обмена данными. Вы можете решить эту проблему сейчас, используя обычный char array с заданным размером, известным во время компиляции, вместо std::string, который может выделять память в голове для длинных строк.

Второй , для < 8 вы испытываете то, что называется SSO ( Оптимизация малых строк ) std::string. Многие реализации std :: string имеют такую ​​оптимизацию. Это значение не всегда будет 8.

Третий , для > 8 у вас есть только метаданные (размер, емкость, указатель на данные кучи) в вашей копии структуры. Все данные лежат в куче. Прочитайте эту реализацию скелета.

РЕДАКТИРОВАНИЕ: Прочитайте этот пост .

ОБМЕН ДАННЫМИ: прочитайте этот пост .

  1. https://docs.microsoft.com/en-us/windows/desktop/Memory/creating-named-shared-memory
  2. https://www.boost.org/doc/libs/1_38_0/doc/html/interprocess.html
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...