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
#include

static 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;
}