“... .exe 已停止工作”只出现在我朋友的电脑上,但不会出现在我的电脑上
"... .exe hast stopped working" only occurs at my friend's computer but not on mine
我的程序发布版本有问题。当我在我的电脑上启动它时,一切正常。没有例外,没有问题或任何其他阻止我使用该程序的东西。当我压缩 exe 及其所需的 DLL 并将其发送给朋友时,他在尝试 运行 服务器时立即收到错误“.exe 已停止工作”。
顺便说一句,它是用 "open62541" 构建的 opc 服务器。当 运行ning 时,它通过使用名为 "Snap7" 的库从 PLC 中检索值。是的,他和我在同一个网络,所以不可能是网络问题。
我们都在使用 windows,我的 IDE 是 Visual Studio 2015。不幸的是,我真的不能 post 这里的任何代码,因为它太多了。此外,我真的不知道 post 哪个代码,因为我不知道错误出现的位置和原因。
编辑:这是我遇到异常的代码。它总是在调用 "UA_Server_addVariableNode" 时抛出。
for (int i = 0; i < 4; ++i)
{
UA_VariableAttributes attrAttr;
UA_VariableAttributes_init(&attrAttr);
UA_QualifiedName attrBrowseName;
UA_QualifiedName_init(&attrBrowseName);
switch (i)
{
case 0: //Setting the ip-address
UA_Variant_setScalar(&attrAttr.value, &UA_STRING(currentPlc.ip), &UA_TYPES[UA_TYPES_STRING]);
attrAttr.displayName = UA_LOCALIZEDTEXT("en_US", "IPAddress");
attrBrowseName = UA_QUALIFIEDNAME(1, "IPAddress");
//Add the PLC value to the PLC-ObjectType
UA_Server_addVariableNode(server, UA_NODEID_NULL, newPlcId,
UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
attrBrowseName,
UA_NODEID_NULL, attrAttr, NULL, &isAvailableNodeId);
break;
case 1: //Setting the rack
UA_Variant_setScalar(&attrAttr.value, ¤tPlc.rack, &UA_TYPES[UA_TYPES_INT32]);
attrAttr.displayName = UA_LOCALIZEDTEXT("en_US", "Rack");
attrBrowseName = UA_QUALIFIEDNAME(1, "Rack");
//Add the PLC value to the PLC-ObjectType
UA_Server_addVariableNode(server, UA_NODEID_NULL, newPlcId,
UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
attrBrowseName,
UA_NODEID_NULL, attrAttr, NULL, &isAvailableNodeId);
break;
case 2: //Setting the slot
UA_Variant_setScalar(&attrAttr.value, ¤tPlc.slot, &UA_TYPES[UA_TYPES_INT32]);
attrAttr.displayName = UA_LOCALIZEDTEXT("en_US", "Slot");
attrBrowseName = UA_QUALIFIEDNAME(1, "Slot");
//Add the PLC value to the PLC-ObjectType
UA_Server_addVariableNode(server, UA_NODEID_NULL, newPlcId,
UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
attrBrowseName,
UA_NODEID_NULL, attrAttr, NULL, &isAvailableNodeId);
break;
case 3: //Setting "isAvailable" to give information about the PLC's status
UA_Variant_setScalar(&attrAttr.value, &isAvailable, &UA_TYPES[UA_TYPES_BOOLEAN]);
attrAttr.displayName = UA_LOCALIZEDTEXT("en_US", "isAvailable");
attrBrowseName = UA_QUALIFIEDNAME(1, "isAvailable");
//Add the PLC value to the PLC-ObjectType
UA_Server_addVariableNode(server, UA_NODEID_NULL, newPlcId,
UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
attrBrowseName,
UA_NODEID_NULL, attrAttr, NULL, &isAvailableNodeId);
break;
}
}
我在 "open62541" header.
中做了一些研究后解决了这个问题
在情况 0 中,我在 "UA_Variant_setScalar" 函数中使用表达式“&UA_STRING(currentPlc.ip)”,我认为 returns 等效于 UA_String "currentPlc.ip"。
但它实际上returns一个临时的object,在函数调用后被删除。结果,object 的实际地址为空,因此出现访问冲突。我只是添加了一行,我将返回的 object 传递给一个变量,然后使用变量的地址。
case 0: //Setting the ip-address
auto value = UA_STRING(currentPlc.ip);
UA_Variant_setScalar(&attrAttr.value, &value, &UA_TYPES[UA_TYPES_STRING]);
attrAttr.displayName = UA_LOCALIZEDTEXT("en_US", "IPAddress");
attrBrowseName = UA_QUALIFIEDNAME(1, "IPAddress");
//Add the PLC value to the PLC-ObjectType
UA_Server_addVariableNode(server, UA_NODEID_NULL, newPlcId,
UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
attrBrowseName,
UA_NODEID_NULL, attrAttr, NULL, &isAvailableNodeId);
break;
我的程序发布版本有问题。当我在我的电脑上启动它时,一切正常。没有例外,没有问题或任何其他阻止我使用该程序的东西。当我压缩 exe 及其所需的 DLL 并将其发送给朋友时,他在尝试 运行 服务器时立即收到错误“.exe 已停止工作”。
顺便说一句,它是用 "open62541" 构建的 opc 服务器。当 运行ning 时,它通过使用名为 "Snap7" 的库从 PLC 中检索值。是的,他和我在同一个网络,所以不可能是网络问题。
我们都在使用 windows,我的 IDE 是 Visual Studio 2015。不幸的是,我真的不能 post 这里的任何代码,因为它太多了。此外,我真的不知道 post 哪个代码,因为我不知道错误出现的位置和原因。
编辑:这是我遇到异常的代码。它总是在调用 "UA_Server_addVariableNode" 时抛出。
for (int i = 0; i < 4; ++i)
{
UA_VariableAttributes attrAttr;
UA_VariableAttributes_init(&attrAttr);
UA_QualifiedName attrBrowseName;
UA_QualifiedName_init(&attrBrowseName);
switch (i)
{
case 0: //Setting the ip-address
UA_Variant_setScalar(&attrAttr.value, &UA_STRING(currentPlc.ip), &UA_TYPES[UA_TYPES_STRING]);
attrAttr.displayName = UA_LOCALIZEDTEXT("en_US", "IPAddress");
attrBrowseName = UA_QUALIFIEDNAME(1, "IPAddress");
//Add the PLC value to the PLC-ObjectType
UA_Server_addVariableNode(server, UA_NODEID_NULL, newPlcId,
UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
attrBrowseName,
UA_NODEID_NULL, attrAttr, NULL, &isAvailableNodeId);
break;
case 1: //Setting the rack
UA_Variant_setScalar(&attrAttr.value, ¤tPlc.rack, &UA_TYPES[UA_TYPES_INT32]);
attrAttr.displayName = UA_LOCALIZEDTEXT("en_US", "Rack");
attrBrowseName = UA_QUALIFIEDNAME(1, "Rack");
//Add the PLC value to the PLC-ObjectType
UA_Server_addVariableNode(server, UA_NODEID_NULL, newPlcId,
UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
attrBrowseName,
UA_NODEID_NULL, attrAttr, NULL, &isAvailableNodeId);
break;
case 2: //Setting the slot
UA_Variant_setScalar(&attrAttr.value, ¤tPlc.slot, &UA_TYPES[UA_TYPES_INT32]);
attrAttr.displayName = UA_LOCALIZEDTEXT("en_US", "Slot");
attrBrowseName = UA_QUALIFIEDNAME(1, "Slot");
//Add the PLC value to the PLC-ObjectType
UA_Server_addVariableNode(server, UA_NODEID_NULL, newPlcId,
UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
attrBrowseName,
UA_NODEID_NULL, attrAttr, NULL, &isAvailableNodeId);
break;
case 3: //Setting "isAvailable" to give information about the PLC's status
UA_Variant_setScalar(&attrAttr.value, &isAvailable, &UA_TYPES[UA_TYPES_BOOLEAN]);
attrAttr.displayName = UA_LOCALIZEDTEXT("en_US", "isAvailable");
attrBrowseName = UA_QUALIFIEDNAME(1, "isAvailable");
//Add the PLC value to the PLC-ObjectType
UA_Server_addVariableNode(server, UA_NODEID_NULL, newPlcId,
UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
attrBrowseName,
UA_NODEID_NULL, attrAttr, NULL, &isAvailableNodeId);
break;
}
}
我在 "open62541" header.
中做了一些研究后解决了这个问题在情况 0 中,我在 "UA_Variant_setScalar" 函数中使用表达式“&UA_STRING(currentPlc.ip)”,我认为 returns 等效于 UA_String "currentPlc.ip"。
但它实际上returns一个临时的object,在函数调用后被删除。结果,object 的实际地址为空,因此出现访问冲突。我只是添加了一行,我将返回的 object 传递给一个变量,然后使用变量的地址。
case 0: //Setting the ip-address
auto value = UA_STRING(currentPlc.ip);
UA_Variant_setScalar(&attrAttr.value, &value, &UA_TYPES[UA_TYPES_STRING]);
attrAttr.displayName = UA_LOCALIZEDTEXT("en_US", "IPAddress");
attrBrowseName = UA_QUALIFIEDNAME(1, "IPAddress");
//Add the PLC value to the PLC-ObjectType
UA_Server_addVariableNode(server, UA_NODEID_NULL, newPlcId,
UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
attrBrowseName,
UA_NODEID_NULL, attrAttr, NULL, &isAvailableNodeId);
break;