1

我試圖創建一個自定義的C++函數,我可以從JavaScript調用。該功能是一個簡單的調整窗口大小的功能。支架 - 殼自定義本地(C++)函數不被調用

我有以下位在以下位置:

在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,然後我構建和調試的調試Win32發佈。當我打開控制檯時,appshell.app.resizeWindow就像預期的那樣。我可以稱它,它工作得很好。如果我在該函數中添加了其他JavaScript代碼,它也可以工作。

對於函數appshell_extensions.cpp,我添加了OutputDebugString(std::wstring(message_name.begin(), message_name.end()).c_str());。對於我寫的函數以外的函數,它將正確輸出消息名稱。對於我寫的那個,我一無所獲。

我沒有從函數本身獲得輸出。

它似乎消息實際上並沒有得到處理它的函數,但我沒有任何線索。我只是使用括號-shell(轉換爲2012)附帶的sln進行編譯。是否有構建步驟,我可能會失蹤或什麼?

謝謝。

回答

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

您試圖調試消息名稱的ProcessMessageDelegate :: OnProcessMessageReceived()方法(appshell_extension.cpp)正在Renderer進程中運行。您必須將VS調試器附加到該子進程才能調試它。現在你正在調試瀏覽器進程(主進程)。

爲了在控制檯窗口中一個簡單的方法來調試子進程,爭取每個子創建一個控制檯窗口:

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的桌面項目做到了:

  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

嗨Czarek,感謝您的評論。我好像從ProcessMessageDeletegate :: OnProcessMessageReceived得到了一些輸出。我唯一不會的時候是我添加的函數被調用(或者不是,因爲我懷疑這種情況可能會發生)。如果我調用其他任何東西,比如DragWindow函數,我會在我的輸出中看到「DragWindow」。這不僅僅是我自己的功能。 – samanime

+0

@samanime嘗試重建VS項目,這可能是一些緩存問題。打掃。重建它。 –

+0

@samanime這也可能是你正在編輯錯誤的文件或在錯誤的時間。在重建項目之前編輯.js文件。 –