Я пытаюсь построить 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);
}
}
Код еще не очищен и будет улучшен после решения этой проблемы, обещаю;)