サンプルプログラム
// ngramð쬷éAperlXNvgððOÀs³¹ÄÊ(WoÍ)ðæèÞ
// system()¾ÆR}hvvgª\¦³êé½ßCreateProcess()ðg¤
AnsiString cmd = "perl " + ExtractFilePath(Application->ExeName) + "gen_ngram.pl " + file;
// ¼OȵpCvðì¬
SECURITY_ATTRIBUTES sa;
ZeroMemory(&sa, sizeof(sa));
sa.lpSecurityDescriptor = NULL;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = TRUE;
HANDLE hRead, hWrite;
if(! CreatePipe(&hRead, &hWrite, &sa, 0))
{
ShowMessage("pCvÌì¬É¸sµÜµ½");
return KU_RTN_NG;
}
//vZXì¬
PROCESS_INFORMATION pi;
ZeroMemory(&pi, sizeof(pi));
STARTUPINFO si;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
si.wShowWindow = SW_HIDE; // R}hvvgðñ\¦
si.hStdOutput = hWrite; // WoÍðãÌpCvÉÏX
if(CreateProcess(NULL, cmd.c_str(), NULL, NULL, TRUE, DETACHED_PROCESS, NULL, NULL, &si, &pi))
{
// WaitForInputIdle(pi.hProcess, INFINITE);
// vZXÌÊðÒÂ
char buf[1024 * 200];
UINT pos = 0;
ZeroMemory(&buf, sizeof(buf));
// INFINITEÅÒÂÆßÁıȢ...
DWORD ret;
while((ret = WaitForSingleObject(pi.hProcess, 0)) != WAIT_ABANDONED)
{
// pCv©çÊðÇÝo·
DWORD avail;
if((PeekNamedPipe(hRead, NULL, 0, NULL, &avail, NULL)) &&
(avail > 0))
{
char tmp[1024 * 16];
ZeroMemory(&tmp, sizeof(tmp));
DWORD read;
if(ReadFile(hRead, tmp, sizeof(tmp) - 1, &read, NULL))
{
memcpy(buf + pos, tmp, read);
pos += read;
}
}
if(ret == WAIT_OBJECT_0)
{
article->ngram->Add(buf);
break;
}
}
}
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
CloseHandle(hRead);
CloseHandle(hWrite);