Следующий код вылетает на некотором компьютере, оператор 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;
}
}
...