сбой boost :: interprocess :: managed_shared_memory на некоторой машине - PullRequest
0 голосов
/ 01 ноября 2019

Следующий код вылетает на некотором компьютере, оператор catch не работает. GAME_ARGUMENTS - это структура, используйте базовый тип, без stl. Скомпилировано с VS2017 и Boost1.70. Управляемая_задача зависит от службы Win32, которую пользователь закрыл?

typedef struct tagGAME_ARGUMENTS{
    char uid[128];
    int account_type;
    bool is_member;
    int duration;
    int game_id;
    char package_name[128];
    char rooter[128];
    int orientation;
    int screen_res;

    tagGAME_ARGUMENTS(){
        strcpy(uid, "0");
        account_type = 0;
        is_member = false;
        duration = 0;
        game_id = 0;
        strcpy(package_name, "");
        strcpy(rooter, "");
        orientation = 0;
        screen_res = 0;
    }
    std::string string()
    {
        boost::format fmt("uid=%1%,is_member=%2%,duration=%3%,game_id=%4%,package_name=%5%,rooter='%6%',orientation=%7%,screen_res=%8%");
        fmt % uid % (int)is_member % duration % game_id % package_name % rooter % orientation % screen_res;
        return fmt.str();
    }
}GAME_ARGUMENTS, *PGAME_ARGUMENTS;

int main(int argc, char **argv) {
    if(argc == 2) {
        using namespace boost::interprocess;
        try {
            managed_shared_memory segment(open_only, argv[1]);
            std::pair<PGAME_ARGUMENTS, managed_shared_memory::size_type> res;
            res = segment.find<GAME_ARGUMENTS>("GAME_ARGUMENTS");
            if(res.second) {
                memcpy(&g_game_arguments, res.first, sizeof(GAME_ARGUMENTS));
                WriteLog(u8"接收到的参数:%s", g_game_arguments.string().c_str());
                segment.destroy<GAME_ARGUMENTS>("GAME_ARGUMENTS");
                std::vector<std::string> rooters;
                boost::split(rooters, g_game_arguments.rooter, boost::is_any_of(","));
            }
            shared_memory_object::remove(argv[1]);
        }
        catch(const std::exception& e) {
            WriteLog(e.what());
            MessageBoxA(nullptr, e.what(), "提示", MB_OK|MB_ICONWARNING);
            return -1;
        }
    }
    ...
...