Я пытаюсь создать пользовательскую функцию 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) для компиляции. Есть ли этап сборки, который я, возможно, пропускаю или что-то?
Благодарю.
Метод 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:
Смотрите переменную subprocess_show_console.
https://code.google.com/p/phpdesktop/source/browse/phpdesktop-chrome/main.cpp?r=6de71bd0217a#126
Вызов InitializeLogging (), который запускает код выше.
Затем вызывается CefExecuteProcess.
В Linux проще отлаживать подпроцессы в окне консоли, так как весь вывод подпроцессов автоматически перенаправляется на консоль из основного процесса. В Windows отсутствует эта удобная функция.
Я понял проблему.
Очевидно, в функциях 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());