Как бороться с ошибкой импорта DLL "onecoreuap \ inetcore \ urlmon \ zone \ zoneidentifier.cxx (359) \ urlmon.dll! [...] 80070002" в контексте JNI? - PullRequest
2 голосов
/ 02 апреля 2019


Я пытаюсь построить JNI-Wrapper для UIAComWrapper.dll, чтобы иметь возможность автоматизировать Windows-код с помощью Java-вызовов. К сожалению, если я только попытаюсь включить мои C # -Dlls, которые включают в себя Wrapped Automation-Calls (напрямую связанные с UIAComWrapper.dll), он выводит следующую ошибку:

onecoreuap \ inetcore \ urlmon \ zone \ zoneidentifier.cxx (359) \ urlmon.dll! 00007FFFAC5005D0: (абонент: 00007FFFAC50010D) ReturnHr (1) tid (1b18) 80070002 Das System kann die angegebene Datei nichtden.

Почему я предполагаю, что эта ошибка вызывает мою проблему с JNI? Поскольку информация об исключении выводит на экран следующее (только выдержка):

siginfo: ExceptionCode = 0xe0434352, ExceptionInformation = 0xffffffff80070002 0x0000000000000000 0x0000000000000000 0x0000000000000000 0x00007fffa4870000

Это тот же адрес стека, который указан в первом окне сообщения об ошибке (80070002).

Я создал следующий заголовочный файл для доступа к моей DLL:

#pragma once
#using <mscorlib.dll>
#include <iostream>
#using <SharpAutomation.dll>

using namespace std;

class BridgeCredentialFactory
{
public:

    // Provide .NET interop and garbage collecting to the pointer.
    static CredentialHandler::HandlerTypes::GenericCredentialHandler^ getCredentialHandlerFor(CredentialHandler::Maps::Browser browser) {
        CredentialHandler::HandlerTypes::GenericCredentialHandler^ handler = CredentialHandler::CredentialFactory::getCredentialHandlerFor(browser);
        return handler;
    }
};

class BridgeGenericCredentialHandler {
public:

    CredentialHandler::Maps::Browser b;

    BridgeGenericCredentialHandler(CredentialHandler::Maps::Browser browser) {
        b = browser;
    }

    void enterUsername(System::String^ username) {
        CredentialHandler::HandlerTypes::GenericCredentialHandler^ handler = resolveInterface(b);

        handler->enterUsername(username);
    }

    void enterPassword(System::String^ username) {
        System::String^ mystring = username;
        CredentialHandler::HandlerTypes::GenericCredentialHandler^ handler = resolveInterface(b);

        handler->enterPassword(mystring);
    }

    void enterCredentials(System::String^ username, System::String^ password) {
        CredentialHandler::HandlerTypes::GenericCredentialHandler^ handler = resolveInterface(b);

        handler->enterCredentials(username, password);
    }

    void clickLogin() {
        CredentialHandler::HandlerTypes::GenericCredentialHandler^ handler = resolveInterface(b);
        handler->clickLogin();
    }

    void clickCancel() {
        CredentialHandler::HandlerTypes::GenericCredentialHandler^ handler = resolveInterface(b);
        handler->clickCancel();
    }

    bool windowExists() {
        CredentialHandler::HandlerTypes::GenericCredentialHandler^ handler = resolveInterface(b);
        System::Console::WriteLine(getBrowserType());
        return handler->windowExists();
    }

    CredentialHandler::Maps::Browser getBrowserType() {
        CredentialHandler::HandlerTypes::GenericCredentialHandler^ handler = resolveInterface(b);
        return handler->getBrowserType();
    }

private:
    CredentialHandler::HandlerTypes::GenericCredentialHandler^ resolveInterface(CredentialHandler::Maps::Browser browser) {
        switch (browser)
        {
        case CredentialHandler::Maps::Browser::Chrome:
            return gcnew CredentialHandler::HandlerTypes::ChromeCredentialHandler();
            break;

        case CredentialHandler::Maps::Browser::Firefox:
            return gcnew CredentialHandler::HandlerTypes::FirefoxCredentialHandler();
            break;

        case CredentialHandler::Maps::Browser::Edge:
        case CredentialHandler::Maps::Browser::InternetExplorer:
            return gcnew CredentialHandler::HandlerTypes::InternetExplorerCredentialHandler();
            break;

        default:
            return gcnew CredentialHandler::HandlerTypes::ChromeCredentialHandler(); //ToDo noch nicht wie gewünscht
            break;
        }
    }
};

Я проверил тип моих сборок, все установлено на x64. Единственное, что я мог себе представить, это источник ошибки - неумелая интеграция DLL-файла. Если мое предположение верно, я был бы очень признателен, чтобы кто-нибудь из вас учил.

Я гуглил в течение нескольких дней, поэтому я был бы удивлен, если бы вы только отправили мне полезную ссылку (если бы вы что-то нашли, я был бы очень рад получить выгоду; я люблю сюрпризы).

Может ли кто-нибудь помочь мне решить эту проблему? Если вам понадобится что-то еще, пожалуйста, дайте мне знать:)


Еще немного кода по запросу:

Звонок начинается с:

CredentialHandler::HandlerTypes::GenericCredentialHandler^ handler = BridgeCredentialFactory::getCredentialHandlerFor(CredentialHandler::Maps::Browser::Chrome);
    handler->enterUsername("Test");

Здесь мы вызываем метод enterUsername, который используется в конкретном обработчике. Это выполняет C # -метод enterUsername ():

 public void enterUsername(String username)
        {
            if (windowExists())
            {
                Mouse.MoveTo(CredentialsHandler.Utils.GetCenterPointFrom(EnterCredentials.InpUsername));
                Mouse.Click(MouseButton.Left);
                Keyboard.Type(username);
            }
        }

Код еще не очищен и будет улучшен после решения этой проблемы, обещаю;)

...