& quot; … .exe перестал работать & quot; происходит только на компьютере моего друга, но не на моем

У меня проблема с версией выпуска моей программы. Когда я запускаю его на своем компьютере, все работает нормально. Нет никаких исключений, никаких проблем или каких-либо других вещей, которые мешают мне работать с программой. Как только я заархивировал exe-файл и необходимые библиотеки DLL и отправил его другу, он сразу же получает сообщение об ошибке «.exe перестал работать», когда пытается запустить сервер.

Кстати, это OPC-сервер, созданный с «open62541». При работе он извлекает значения из ПЛК с помощью библиотеки «Snap7». И да, он находится в той же сети, что и я, поэтому причиной не может быть сетевое соединение.

Мы оба используем Windows, и моя IDE — Visual Studio 2015. К сожалению, я не могу публиковать здесь какой-либо код, потому что это слишком много. Более того, я не знаю, какой код размещать, так как не знаю, где и почему возникает ошибка.

РЕДАКТИРОВАТЬ: Вот мой код, где я получаю исключение. Он всегда генерируется, когда вызывается 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, &currentPlc.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, &currentPlc.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;
}
}

0

Решение

Я решил проблему после некоторых исследований внутри заголовка «open62541».

В случае 0 я использую выражение «&UA_STRING (currentPlc.ip) «в функции» UA_Variant_setScalar «, которая, как я думал, возвращает эквивалент UA_String для» currentPlc.ip «.

Но на самом деле он возвращает временный объект, который удаляется после вызова функции. В результате фактический адрес объекта является нулевым, следовательно, я получаю нарушение прав доступа. Я просто добавил одну строку, в которой я передаю возвращенный объект в переменную, а затем использую адрес переменной.

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;
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]