2012-03-01 3 views
1

다른 응용 프로그램 스레드의 콜백에 문제가 있습니다. Dll은 Addinational 응용 프로그램과 응용 프로그램 사이의 래퍼 중 하나이며 응용 프로그램 메모리 내에서 동일한 PID로 작업합니다. Addinational 응용 프로그램 (다른 스레드와 PID)는 메인 루프에서 "무언가"를 찾고있는 응용 프로그램이며, 발견되면 DLL에서 콜백 함수를 호출 한 다음 응용 프로그램에서 콜백 함수를 호출합니다. 위의 이미지를 조금 혼란스럽게 보일 수도 있습니다. 그리고 프로그래머 충돌 메시지 (DLL은 응용 프로그램에서 콜백 함수를 호출 할 때) : MainProgram.exe에서 0x70786a46에서다른 스레드의 콜백

처리되지 않은 예외 :가 0xc0000005 : 위치 0x00000164 읽기 액세스 위반을. IE를 사용하여

콜 스택 mshtml.dll을

Propably 응용 프로그램은 UI를 업데이트 할 것. Addinational 응용 프로그램 콜백이있을 때 어떻게 UI를 업데이트 할 수 있습니까?

Callbacks

답변

1

SendMessage는 GUI 스레드에 결과를 게시하는 일반적인 솔루션입니다. 그것은 당신을 위해 모든 스레드 동기화를 수행하고 수신 스레드의 창에 의해 메시지가 처리 될 때까지 ’을 반환하지 않습니다.

PostThreadMessage은 수신자가 예를 들어 수신기가 모달 루프에있을 때 메시지가 손실되거나 손실 될 수 있기 때문에 신뢰성이 떨어집니다. MessageBox, 스레드 메시지 –을 차단하는 훅을 추가하지 않았다면 SendMessage을 사용하십시오.

고급 기술은 직접 스레드 동기화를 수행합니다. 버퍼를 가지고 있지만 어쨌든 아마도 GUI 스레드에 대해서도 SendMessage을 포함 할 것입니다. 그래서 그걸 가지고 시작하는 것이 좋습니다. 그럴 경우 ’이 충분하면 돈을 ’ do 더하십시오.

EDIT : dang, 첫 번째 문장은 스레드에 대해 이야기하지만 실제로는 한 프로세스에서 다른 프로세스로 데이터를 보내는 것에 관한 내용입니다. 음, 그게 WM_COPYDATA입니다. 하나의 프로세스에서 (사용자 레벨) 포인터 이 다른 프로세스에서 유효하지 않은 것으로 간주하십시오..

+0

가능하다. 그러나 응용 프로그램이 Vista 이상에서 실행되어야하는지 UIPI를 확인하십시오. – user877329

+0

@ user877329 감사합니다. 하지만 여기서 스레드 동기화를 말하고 있습니다. UIPI (User Interface Privilege Isolation)는 그 문제가 아닙니다. 그래서 SendMessage는 Windows 7까지 훌륭하게 작동합니다. –

+0

PostMessage가 응용 프로그램을 충돌 (이전과 같은 오류), SendMessage가 UI 업데이트 기능에서 멈추고 함수 (응용 프로그램 아님)를 중단했습니다. hwnd = CreateWindow (args)를 통해 메시지를 처리하는 숨겨진 창을 만들고 추가 루프에서 메시지 루프를 시작하고 Proc 함수를 추가 한 다음 SendMessage (hwnd, WM_APP + 101, 0,0); - 어쨌든 UI 업데이트 안함 :/ – user1112008

관련 문제