printfをwindowsアプリで出力する
今の所、自作の将棋ソフトはGUIが無いので、コンソールで動かすか、DLLとしてCSA.EXEなどから呼び出してもらう方法しかありません。
DLLで困るのは、読み筋などの情報が出せない点です。
csa将棋のソースをもらって改造すればできるんでしょうけど、時間的に微妙(vc++でのwindowsアプリは経験少ないし、MFCはそもそもVCTKではコンパイルできなさそう)
というわけで、
やはり同じところで不便に思われたようで、
礒部将棋の礒部さんが、windowsアプリからprintf出力を表示するプログラムを公開されてます。
http://www.geocities.jp/sobechan/
DLLに結合してコンパイルすると、別途起動させておくprintf32.exeにプロセス間通信で、出力してくれます。
これは便利です。助かりました。
>通常のprintfと違って'\n'による改行ができません。
>また、一回のprintfの呼び出しは1行として強制的に
>改行されます。
しかし、出力するたびに改行するようで、困りました。
つうわけで、改造しました。
いきあたりばったりで改造してるからコードが汚いですが、
これで、128文字ごとか、文中に「\n」が現れたところで改行してくれます。
バッファリングしてるわけです。
礒部さん感謝 m(_ _)m
#include
#include
#include
//#include
#includestatic char line[4096];
static char* p;
int printf(const char *format,...)
{static char txt[1024];
HWND hPrint=NULL;
COPYDATASTRUCT cds;
int len;
va_list argv;va_start(argv,format);
len = _vsnprintf(txt, 1023, format, argv);
va_end(argv);
if (len < 0) return 0;strcat(line,txt);
len=strlen(line);if(len>128) {
if ( (hPrint=FindWindow("printf32","printf32") ) != NULL) {
cds.dwData = 1;
cds.lpData = (void*)line;
cds.cbData = 127;
SendMessage(hPrint, WM_COPYDATA, 0, (LPARAM)&cds);
}
strcpy(line,line+128);
} else {if( strchr( line,'\n')!=NULL ) {
if ( (hPrint=FindWindow("printf32","printf32") ) != NULL) {
cds.dwData = 1;
cds.lpData = (void*)line;
cds.cbData = len+1;
SendMessage(hPrint, WM_COPYDATA, 0, (LPARAM)&cds);
}
*line=0;
}
}
return 0;
}