2017年5月16日火曜日

VS2017のAllocConsoleでUnicode(UTF-16)出力

std::wcout.imbue(std::locale("Japanese")) ;
AllocConsole() ;
FILE * pF = _wfdopen( h, L"w" ) ;
fclose( stdout ) ;
*stdout = *pF;
setvbuf( stdout, NULL, _IONBF, 0 ) ;

VS2010では上記のコードで、wcout、wprintfを使ってコンソール出力が出来た。

VS2017でコンパイルすると、コンパイルは通るが実行すると落ちる。
いろいろ調べてみた結果、_wfreopen(freopen)でstdoutを"CONOUT$"で開き直すとコンソールと紐付けは出来るようだ。

でも、printfすると落ちる。
wprintfすると表示されなかったり、表示されるが16進文字だったり、文字化けしていたり。
wcoutは日本語は表示されるが、"\n"、endlの部分で落ちる。
coutはやってない。
唯一、表示されるのがWriteConsole関数。

試してみたのは下記のキーワード
wcout.imbue
_wsetlocale(setlocale)
setvbuf
_setmode
wcout.rdbuf
SetConsoleOutputCP
sync_with_stdio

どうやってもまともに表示されない。

色々やっているとwcoutで落ちるのは、rdbufが準備できていない?感じで、rdbufを入れ替える方法を見つけたのでwcout以外は全部捨てて対応したコードが下記。

class Out {
private :
class Buf : public std::wstreambuf {
private :
HANDLE h ;
public :
virtual int_type overflow( int_type c = EOF ) override {
if( c == EOF ) return c ;
wchar_t sBuf[] = { c, '\0' } ;
DWORD nW ;
WriteConsole( this->h, sBuf, 1, &nW, NULL ) ;
return c ;
}
Buf( void ) {
this->h = GetStdHandle( STD_OUTPUT_HANDLE ) ;
}
} oBuf ;
std::wstreambuf * pOld ;
public:
Out( void ) { this->pOld = std::wcout.rdbuf( &oBuf ) ; }
~Out( void ) { std::wcout.rdbuf( this->pOld ) ; }
} ;

AllocConsoleした後に、Outクラスのインスタンスを作ると、wcoutのバッファがoverflow関数に1文字ずつ渡ってくるらしい。内部では唯一まともに動くWriteConsoleを呼び出す。

2013年6月24日月曜日

Chrome Secure Shellでペーストの方法

Ctrl+VとかAlt+Vとか試してみるもペーストできない。

スクリーン上の文字列を選択すると、画面の真ん中に
Selection Copied
と表示される。

これが表示されるということはクリップボードの値を貼り付けることが出来るはず。

マニュアルを調べてみたら
Ctrl+Shift+V
だって。

2013年6月4日火曜日

Zlib 1.2.8

zlibのバージョンを1.2.8に上げた所、プログラムが動かなくなった。
デバッグすると、初期化(deflateInit)でエラーが返ってきている。
エラーはZ_STREAM_ERROR。

ネットで検索すると、引数の圧縮レベルが間違っているという。
指定している値はZ_DEFAULT_COMPRESSION(-1)で問題ないはず。
試しに0とか6とか試してみてもダメ。

deflate.cの中までデバッグしてみると、渡している構造体(z_stream)のzallocをチェックしている所でエラーになっている。この値がNULLの場合、Z_SOLOのコンパイルスイッチが定義されていると即エラー。
何らかのアロケート関数を渡す必要があるみたい。
Z_SOLOを定義して無ければzcallocという関数が自動で設定される。

ライブラリのサイズが減ったと思ったら、このへんの関数を削る設定がデフォルトになってたみたい。
元々300KBぐらいで、削減して260KBぐらいになってた。
Windowsデスクトップアプリでは大したサイズではないので、zlibのプロジェクトからZ_SOLOを消してコンパイルし直した所、今までと同じ動作に戻った。

2012年4月3日火曜日

サーバ

さくらのVPSってのがあるらしい。

失敗した。
さっきcoreserver1年更新したばっか。
でも、いまさくらのVPSは1Gと2G大人気過ぎで契約が一時停止中なので、
来年はそっちで更新か。

2012年1月3日火曜日

REGZA 42ZG1でPS3の3D設定

3Dテレビを買ってから、まともな3Dコンテンツを見たことがなかった。
というより、買おうとしたけど見たいものが売ってなかったので、GT5で軽く3D体験をして以来3Dの機能は使わずじまい。
3Dメガネも電池が切れてるし。(電池なしかUSB充電出来る奴がほしい)

年末から年明けにかけて、長い休みがあるから3Dのブルーレイでも買ってみようと思いアマゾンで検索してみる。
前に探した時よりかはラインナップは増えていた。
塔の上のラプンツェルを見つけ、買ってみた。

早速見てみようと、PS3で再生してみると3Dに対応したTVと再生機器で再生してくれと、失礼な表示が出る。
うちのテレビは3D対応してるし、PS3も対応してるからお前の認識を直せと。

何回か再生しなおしても結果は変わらず。
前にGT5で3Dモードには普通になっていたし、PCで3Dのコンテンツ試した時も問題なかった。
変なチェック入れずに、再生を始めてくれれば、テレビの3Dモードをこっちで切り替えすればなんとかなりそうなのに、始めてくれない。

ネットで調べてみると、どうやらPS3がテレビのことを3Dテレビと認識してくれないといけないことが判明。
早速ディスプレイ設定で認識させてみようとしたが、これも失敗。
前からこの設定はしてあるから、変わるはずも無い。

しばらく悩んだあと、ふとREGZAの裏設定を変えていることを思い出す。
PCの調子が悪いから、HDMIモードを1から3に変えていた。
その後バージョンアップを繰り返し、おそらくいつの間にか不具合は解消されていたんだろうけど特に不都合もなかったので、設定はそのままにしていた。

ところがこの設定が今回の不都合だったらしく、設定をモード3から初期の1に戻してPS3に認識させてみたら、無事おまえのTVは3D対応だと認識してもらうことができた。
もちろんブルーレイ3Dの再生もチェックを抜けて、先に進んだ。

後はPCの表示が問題なければOK。
例の再現性100%の動画で確認したけど大丈夫になっていた。
これを書いている間も問題なかったんで、解決。

でもこの嵌った時間を返して欲しい。

2011年12月28日水曜日

VCでUTF-8 BOMなしファイル作成方法

UTF-8版のLuaで、読み込みできるファイルを作る場合
FILE pFP = NULL ;
_wfopen_s( &pFP, L"FileName", L"w,ccs=UTF-8" ) ;

これでUTF-8のファイルができるけど、BOM(シグネチャ)ありしか
パラメータでは選択できず、BOM(シグネチャ)なしを指定できない。
VisualStudioのエディタでは指定できるのに・・・・。

どうやっても書かれてしまうのは仕方ないので、そのすぐ後でSeekする。
fseek( pFP, 0, SEEK_SET ) ;

これで読めるようになった。

スマートな方法はないのか?
open時にccsの指定はなしか、バイナリにしてしまって、
文字列を自分でUTF-8に変換して出力すれば大丈夫そうな気もするが。。。

2011年6月19日日曜日

Android開発備忘録 その3

エミュレータ画面の回転

[左CTRL]+[F11]