javascript — Не вызывается пользовательская собственная функция Bracket-Shell (C ++)

Я пытаюсь создать пользовательскую функцию C ++, которую я могу вызвать из JavaScript. Функция проста, чтобы просто изменить размер окна.

У меня есть следующие биты в следующих местах:

В appshell_extensions_platform.h:

#if defined(OS_WIN)
void ResizeWindow(CefRefPtr<CefBrowser> browser, int width, int height);
#endif

В appshell_extensions_win.cpp:

void ResizeWindow(CefRefPtr<CefBrowser> browser, int width, int height) {
OutputDebugString(L"ResizeWindow");
CefWindowHandle hWnd = browser->GetHost()->GetWindowHandle();
SetWindowPos(hWnd, 0, 0, 0, width, height, SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE);
}

В appshell_extensions.js:

/**
* Resize the window to the given size.
*
* @param {number} width
* @param {number} height
*
* @return None. This is an asynchronous call that sends all return information to the callback.
*/
native function ResizeWindow();
appshell.app.resizeWindow = function (width, height) {
ResizeWindow(width, height);
};

В appshell_extensions.cpp:

} else if (message_name == "ResizeWindow") {
// Parameters:
//  0: int32 - width
//  1: int32 - height
int width = argList->GetInt(0);
int height = argList->GetInt(1);
ResizeWindow(browser, width, height);
}

Используя Visual Studio 2012, я затем собираю и отлаживаю релиз Debug Win32. Когда я открываю консоль, appshell.app.resizeWindow там, как и ожидалось. Я могу назвать это, и это работает просто отлично. Если я добавлю дополнительный код JavaScript в функцию, он также будет работать.

Для функции в appshell_extensions.cpp, Я добавил OutputDebugString(std::wstring(message_name.begin(), message_name.end()).c_str());, Для функций, отличных от той, которую я написал, он выведет имя сообщения правильно. За тот, что я написал, я ничего не получаю.

Я также не получаю вывод от самой функции.

Похоже, что сообщение на самом деле не попадает в функцию, которая его обрабатывает, но я понятия не имею. Я просто использую sln, поставляемый с скобками-оболочкой (преобразован в 2012) для компиляции. Есть ли этап сборки, который я, возможно, пропускаю или что-то?

Благодарю.

1

Решение

Метод ProcessMessageDelegate :: OnProcessMessageReceived () (appshell_extension.cpp), в котором вы пытаетесь отладить имя сообщения, выполняется в процессе Renderer. Вы должны присоединить отладчик VS к этому подпроцессу, чтобы иметь возможность его отладки. Прямо сейчас вы отлаживаете процесс Browser (основной процесс).

Чтобы упростить отладку подпроцессов в окне консоли, попробуйте создать окно консоли для каждого подпроцесса:

if (show_console) {
AllocConsole();
FILE* freopen_file;
freopen_s(&freopen_file, "CONIN$", "rb", stdin);
freopen_s(&freopen_file, "CONOUT$", "wb", stdout);
freopen_s(&freopen_file, "CONOUT$", "wb", stderr);
}

Поместите этот код перед CefExecuteProcess (), который запускает подпроцессы.

Посмотрите, как я это сделал в проекте PHP Desktop:

  1. Смотрите переменную subprocess_show_console.
    https://code.google.com/p/phpdesktop/source/browse/phpdesktop-chrome/main.cpp?r=6de71bd0217a#126

  2. Вызов InitializeLogging (), который запускает код выше.

  3. Затем вызывается CefExecuteProcess.


В Linux проще отлаживать подпроцессы в окне консоли, так как весь вывод подпроцессов автоматически перенаправляется на консоль из основного процесса. В Windows отсутствует эта удобная функция.

0

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

Я понял проблему.

Очевидно, в функциях JavaScript первым параметром ДОЛЖЕН быть обратный вызов, даже если вы его не используете.

Изменение части JavaScript для решения этой проблемы:

/**
* Resize the window to the given size.
*
* @param {number} width
* @param {number} height
*
* @return None. This is an asynchronous call that sends all return information to the callback.
*/
native function ResizeWindow();
appshell.app.resizeWindow = function (width, height) {
ResizeWindow(_dummyCallback, width, height);
};

У меня также была небольшая проблема с реальной логикой изменения размера. Вам нужно использовать дескриптор окна browser->getHost()->getWindowHandle() родитель:

`CefWindowHandle hWnd = getParent(browser->GetHost()->GetWindowHandle());
0