BOOL TokNamedPipeInit(void (WINAPI * pFuncCB)(BYTE * buf))
{
// if( !pFuncCB ) return FALSE;
/* Named PIPE를 2개를 만들어서 한 개는 입력으로 한 개는 출력으로 사용한다.
단 Remote에서는 반대로 사용하여야 한다. */
g_hInPipe = CreateNamedPipe("\\\\.\\PIPE\\TOK_BCHS_PIPE_I", PIPE_ACCESS_INBOUND,
PIPE_WAIT, 1, PIPE_BUF_SIZE, PIPE_BUF_SIZE, PIPE_TIMEOUT, NULL);
g_hOutPipe = CreateNamedPipe("\\\\.\\PIPE\\TOK_BCHS_PIPE_O", PIPE_ACCESS_OUTBOUND,
PIPE_WAIT, 1, PIPE_BUF_SIZE, PIPE_BUF_SIZE, PIPE_TIMEOUT, NULL);
if( g_hInPipe == INVALID_HANDLE_VALUE || g_hOutPipe == INVALID_HANDLE_VALUE )
{
if( g_hOutPipe != INVALID_HANDLE_VALUE ) CloseHandle(g_hOutPipe);
if( g_hInPipe != INVALID_HANDLE_VALUE ) CloseHandle(g_hInPipe);
debug_printf_win(4, "NamedPipe is not opened!");
return FALSE;
}
/* 파라미터로 Callback Function을 등록하도록 하였으며, PIPE를 통해서 데이터가 입력되었을 때 처리하기 위한
스레드를 생성한다. */
g_pPipeFuncCB = pFuncCB;
g_hPipeListener = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) TokListenerProc, NULL, 0, &g_dwPipeThreadId);
if( g_hPipeListener == INVALID_HANDLE_VALUE )
{
debug_printf_win(4, "PipeThread is not created!");
return FALSE;
}
/* PIPE를 통해 IPC 통신을 하기 위한 Remote Application을 실행한다. */
WinExec("C:\\Project\\SP2_PC\\BTUI_App\\BTUIApp.exe", SW_SHOWNORMAL);
return TRUE;
}
void TokNamedPipeDeinit()
{
DWORD dwTemp;
if( g_hOutPipe != INVALID_HANDLE_VALUE ) CloseHandle(g_hOutPipe);
if( g_hInPipe != INVALID_HANDLE_VALUE ) CloseHandle(g_hInPipe);
if( GetExitCodeThread(g_hPipeListener, &dwTemp) )
{
if( dwTemp == STILL_ACTIVE ) TerminateThread(g_hPipeListener, 3);
}
if (g_hPipeListener != INVALID_HANDLE_VALUE) CloseHandle(g_hPipeListener);
}
DWORD TokListenerProc(void * pParam)
{
BYTE szPipeBuffer[PIPE_BUF_SIZE];
BYTE * pInBuffer;
DWORD dwReadLen;
BOOL bRead;
while( TRUE )
{
bRead = ReadFile(g_hInPipe, szPipeBuffer, PIPE_BUF_SIZE, &dwReadLen, NULL);
if( dwReadLen )
{
BYTE szTempBuffer[255];
if( !bRead ) return 2;
if( *((WORD *)&szPipeBuffer[0]) == 0xFFFF ) break;
pInBuffer = (BYTE *) malloc(dwReadLen);
memcpy(pInBuffer, szPipeBuffer, dwReadLen);
#if 0
/* PIPE를 통해 입력된 Command를 처리하는 함수 */
TokNamedPipeCmdRecv(pInBuffer, dwReadLen);
#else
if( g_pPipeFuncCB ) g_pPipeFuncCB(pInBuffer);
else debug_printf_win(4, (char *) pInBuffer);
#endif
}
Sleep(10);
}
debug_printf_win(4, "PIPE Closed!");
if( g_hOutPipe != INVALID_HANDLE_VALUE ) CloseHandle(g_hOutPipe);
if( g_hInPipe != INVALID_HANDLE_VALUE ) CloseHandle(g_hInPipe);
return 0;
}
Thursday, August 10, 2006
Subscribe to:
Post Comments
(
Atom
)
No comments :
Post a Comment