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

У меня проблема с версией выпуска моей программы. Когда я запускаю его на своем компьютере, все работает нормально. Нет никаких исключений, никаких проблем или каких-либо других вещей, которые мешают мне работать с программой. Как только я заархивировал 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;
    }
}

1 ответ

Решение

Я решил проблему после некоторых исследований внутри заголовка "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;
Другие вопросы по тегам