2011-01-04 2 views
1

그래서 나는 C 책 예제를 통해 창문을 가지고 실행/구현하고 있습니다. digg 인젝션 부분에 관한 문제가 있습니다. 문제는 해결할 수 없습니다. 문제 - 다른 프로세스/스레드에 속한 창에 LPARAM으로 TCHAR

나는 다른 스레드/프로세스에 속하는 대화 상자를 생성하고 난 그 다음 몇 가지 기능에 그 var에 사용할 수 있도록 그것을 TCHAR 변수를 보내려고하고 (기능 모두를 같은 DLL 파일에 TCHAR 있습니다)

그래서 대화 상자가 만들어지고 다른 스레드에서 잘 앉아 있으면 메시지를 보냅니다.

먼저 내가 나중에 난 그냥 나 또한 내가 DLL에서이 작업을 수행해야 함을 언급하자 (내가하지 대화 상자의 스레드에서 DLL 스레드에서이 작업을 수행 할 정보와 그것을 채우기 다음

TCHAR finalpath[MAX_PATH]; 

TCHAR 선언 쓰레드가 필요한 tchar을 채울 수있는 유일한 방법이기 때문에 (나는 dll 작업 디렉토리를 얻어서 tchar로 채워야한다.)

그래서이 tchar에서이 정보를 얻으면 대화 상자에 메시지를 보내려고한다. tchar을 LPARAM으로 사용하십시오 (wparam은 hwnd btw입니다)

SendMessage(hWndDIPS, WM_APP, (WPARAM) lista, (LPARAM)finalpath); 
0 이후

난 ... (이 기능은 공유 DLL에 상주 위입니다 참조 같은 절차에 의해 호출 매개 변수를받을 예정이다

INT_PTR WINAPI Dlg_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { 

    switch (uMsg) { 
     chHANDLE_DLGMSG(hWnd, WM_CLOSE, Dlg_OnClose); 

     case WM_APP: 


    SaveListViewItemPositions((HWND) wParam, (TCHAR)lParam); 
     break; 
    } 

    return(FALSE); 
} 

기능을 다른 스레드 대화 절차 루프에서 기본 학업을 다음과 같이 정의 ..

공극 SaveListViewItemPositions (HWND hWndLV, TCHAR sejv []) {...}는

나 이로부터 얻을 컴파일러 에러

이다,
Error 7 error C2664: 'SaveListViewItemPositions' : cannot convert parameter 2 from 'TCHAR' to 'TCHAR []' 

그래서 나는 왜 이런 일이 일어나는 지 잘 모릅니다. tchar 배열을 누른 다음 매개 변수에 배열을 사용하는 방법을 추가해야합니다. (예 : 매개 변수에 배열을 사용하는 방법을 추가해야합니다. 더 이상 오류가 발생하지 않고 함수에서 매개 변수를 사용할 수 없습니다.)

그렇다면 왜 변환되지 않습니까?

이 대화 상자에서 tchar 변수를받는 다른 해결책이 있다면 설명하십시오.

덕분에

+0

포인터를 전달하기 만하면 프로세스 경계를 ​​넘어 데이터를 보내려고합니까? – wj32

답변

1

나는 당신의 문제는 당신이 TCHARs (TCHAR *)의 배열 대신 TCHAR에 LPARAM를 타입 캐스팅하고 있다고 생각합니다. 그것을 바꿔보고 문제가 해결되는지 확인하십시오.

+0

그게 변환 문제를 해결하지만, tchar 변수가 비어있는 어떤 빌어 먹을 이유 때문에 나는 – Marko29

+0

_tfreopen (_T ("C : /sometext.txt"), _T ("w"), stdout);으로 테스트합니다. wprintf (L "% s,", sejv); fclose (stdout); 다른 스레드에 속한이 대화 상자에 변수를 전달할 수있는 방법이 있습니까? 어떻게 hwnd를 넘겨 줄 수 있지만 tchar은 안되는지 궁금합니다. – Marko29

+0

죄송합니다 ... 저는 Win32에서 프로세스 간 통신에 익숙하지 않습니다. :-( – templatetypedef

5

형식 선언을 수정하고 LPARAMTCHAR*으로 올바르게 변환 한 후에도 코드가 올바르지 않습니다. 해당 윈도우 프로 시저에 전달하는 '매개 변수'는 포인터이며 모든 포인터와 마찬가지로 프로세스 주소 공간 내에서만 유효합니다. 리시버 창은 ReadProcessMemory을 사용하고 프로세스의 문자열을 자체 프로세스로 복사해야합니다. 물론 이것은 수신자 프로세스가 프로세스 ID를 알고 있으며 메모리에서 읽을 수있는 적절한 권한이 있음을 의미합니다. ReadProcessMemory은 NULL 종결 자의 위치를 ​​추측 할 수 없기 때문에 문자열의 길이를 전달해야합니다 (MAX_PATH 최대 길이로 계산할 수도 있지만 심각한 문제는 아닙니다).

당신이 맞습니다. 이것은 두통이며, 길 아래로 더 많이 있습니다. 특권 문제는 쇼 스토퍼 일 수 있습니다.

사용할 수있는 몇 가지 IPC 메커니즘이 있습니다. 쉬운 것은 익명의 명명 된 파이프입니다 (Anonymous Pipe Operations 참조). 공유 메모리는 다른 것입니다 (Using Shared Memory in a Dynamic-Link Library 참조). COM은 또한 작동합니다 (프로세스 서버에서 호스트되는 클래스의 인스턴스를 생성하고 COM 마샬링이 나머지 작업을 수행하게하려면 Marshaling Details 참조). 또는 프로세스 경계 사이에 COM 인터페이스를 수동으로 마샬링 할 수 있습니다 (CoMarshalInterface 참조).

+0

매우 정확한 설명 주셔서 감사합니다. wm_copydata는 어떨까요? 가장 쉬운 방법이라고 생각했습니다. – Marko29

+1

@ Marko29 : 두 프로세스의 코드를 관리하고 있고 창 메시지를 사용하고 있다면 WM_COPYDATA는 실제로 한 프로세스에서 다른 프로세스로 문자열처럼 작고 단순한 버퍼를 복사하는 가장 좋은 방법입니다. TCHAR을 사용한다면 항상 프로세스를 컴파일하는 데주의하지 않는 한 각 프로세스마다 다른 것을 의미 할 수 있습니다. 두 개의 유니 코드 또는 ANSI가 서로 일치해야합니다 (버퍼가 유니 코드 또는 ANSI인지 여부에 상관없이 수신자에게 보낸 사람 깃발을 넣고 수신기가 필요한 경우 변환 시키거나 TCHAR의 종류와 상관없이 항상 유니 코드를 보내도록 할 수 있습니다).) –

+0

그들은 모두 유니 코드입니다. 경고를 주셔서 감사합니다. – Marko29

관련 문제