1

JavaScript에서 호출 할 수있는 사용자 지정 C++ 함수를 만들려고합니다. 이 함수는 창 크기를 조정하는 간단한 함수입니다.브라켓 셸 사용자 지정 네이티브 (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에서

: 비주얼 스튜디오 2012를 사용

} 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); 
} 

, 나는 그 빌드 및 디버그 디버그는 Win32 릴리스합니다. 콘솔을 열면 appshell.app.resizeWindow이 예상대로 나타납니다. 나는 그것을 부를 수 있고 그것은 잘 작동한다. 함수에 추가 JavaScript 코드를 추가하면 작동합니다.

appshell_extensions.cpp의 함수에 OutputDebugString(std::wstring(message_name.begin(), message_name.end()).c_str());을 추가했습니다. 필자가 작성한 함수가 아닌 다른 함수의 경우 메시지 이름을 올바르게 출력합니다. 내가 쓴 사람에게는 아무것도 얻지 못합니다.

함수 자체에서 출력을 얻지 못합니다.

메시지가 처리하는 기능에 실제로 도달하지 못하는 것 같습니다. 단서가 없습니다. 나는 방금 괄호 셸 (2012 년으로 변환)과 함께 제공된 sln을 사용하여 컴파일하고 있습니다. 어쩌면 실종되었거나 뭔가 건설 단계가 있습니까?

감사합니다.

답변

0

문제를 파악했습니다.

분명히 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)가 렌더러 프로세스에서 실행 중입니다. 디버깅 할 수 있으려면 해당 하위 프로세스에 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가 호출됩니다.서브 프로세스의 모든 출력이 자동으로 기본 과정에서 콘솔에 전달 될 때

리눅스에

가 콘솔 창에 디버그 하위 프로세스에 쉽게

. Windows에는이 깔끔한 기능이 없습니다.

+0

안녕하세요. 의견을 보내 주셔서 감사합니다. ProcessMessageDeletegate :: OnProcessMessageReceived에서 출력을 얻는 것 같습니다. 내가 추가 한 함수가 호출되었을 때만 (또는 아닌지 의심 스럽습니다) 때가 있습니다. DragWindow 함수처럼 거기에있는 다른 것을 호출하면 내 출력에 "DragWindow"가 표시됩니다. 그것은 내 자신의 기능이 아닙니다. – samanime

+0

@samanime VS 프로젝트를 재구성 해보십시오. 캐시 문제 일 수 있습니다. 이거 치워. 다시 빌드하십시오. –

+0

@samanime 잘못된 파일이나 잘못된 시간을 편집하고있는 것일 수도 있습니다. 프로젝트를 재 빌드하기 전에 .js 파일을 편집하십시오. –

관련 문제