CommandLineToArgvAってないの???

ちょっとした小さなツールをC++で組むとき、CRTは使わないときはできるだけCRTをリンクしないようにしたいわけです。

でも、エントリポイントに WinMainとかしてしまうと、コマンドライン引数をうまくハンドリングできなくて悩む。#define UNICODE とかして、UNICODEにすると、CommandLineToArgvWというAPIがあるので、簡単に、argc(int) と argv(char**)がとれてラクができますが・・・。

なぜか・・・ANSIバージョンの CommandLineToArgvA がないのはなんでなんでしょうかねぇ・・・。
というわけで、解決方法は3つ。

  1. そもそもANSI文字列を使わない。
  2. 自分でコマンドライン文字列(GetCommandLine API)パーサーを書く
  3. CommandLineToArgvWで得られた引数リストをANSI文字列に変換する

一番ラクそうなのは3かな・・・ということで、やっつけで書いてみましたが・・・これでいいのかな・・・(^^;;;

#define GLOBALALLOC(S) reinterpret_cast(GlobalAlloc(GPTR,(S)))
#define GLOBALFREE(X) {if(X){GlobalFree(reinterpret_cast(X));(X)=NULL;}}

#define HEAPALLOC(S) HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(S))
#define HEAPFREE(X) {if(X){HeapFree(GetProcessHeap(),0,reinterpret_cast(X));(X)=NULL;}}

PSTR *CommandLineToArgvA(LPCSTR lpCmdLine,int *pNumArgs)
{
  PSTR *pArgvA = NULL;
  int Argc = 0;

  PWSTR *pArgvW = NULL;
  PWSTR pM2WBuffer = NULL;
  int *pcchLen = NULL;
  int cchBufferLength = 0;

  *pNumArgs = 0;

  if((cchBufferLength = MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,lpCmdLine,-1,NULL,0))     goto cleanup;

  if((pM2WBuffer = (PWSTR)HEAPALLOC((cchBufferLength+1)*sizeof(WCHAR))) == NULL)
    goto cleanup;

  MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,lpCmdLine,-1,pM2WBuffer,cchBufferLength+1);
  pArgvW = CommandLineToArgvW(pM2WBuffer,&Argc);

  //コマンドラインをマルチバイトに変換した後の
  //文字数(配列pcchLen)、文字数合計(cchBufferLength)を求める
  if((pcchLen = (int*)HEAPALLOC(sizeof(int)*Argc)) == NULL)
    goto cleanup;

  cchBufferLength = 0;
  for(int i=0;i    {
      pcchLen[i] = WideCharToMultiByte(CP_ACP,0,pArgvW[i],-1,NULL,0,NULL,NULL);
      cchBufferLength += ++pcchLen[i];
    }

  //コマンドライン文字列の配列を取得して格納する。
  if((pArgvA = (PSTR*)GLOBALALLOC(cchBufferLength + sizeof(PSTR)*Argc)) == NULL)
    goto cleanup;

  for(int i=0;i    {
      pArgvA[i] = (i < 1) ? (PSTR)pArgvA + sizeof(PSTR)*Argc : pArgvA[i-1] + pcchLen[i-1];
      WideCharToMultiByte(CP_ACP,0,pArgvW[i],-1,pArgvA[i],pcchLen[i],NULL,NULL);
    }

cleanup:
  HEAPFREE(pcchLen);
  HEAPFREE(pM2WBuffer);
  GLOBALFREE(pArgvW);  // 解放処理を忘れていたので追加しました。(2010/7/4)
  *pNumArgs = Argc;
  return pArgvA;
}

こんなんでエエのかな・・・。。。


CommandLineToArgvA その2

選択肢がない

iPhone/iPod Touch のアプリを使っていると、やっぱりちょっといじりたく(作りたく)なるのは、プログラムをかじったことのある人なら分かるでしょう。
やっぱり使うだけじゃなく、中身を知りたい、作ってみたい、と思うのは自然の欲求です(笑)

しかし・・・現状、iPhone/iPod Touchで、自作のアプリを動かすには、相当経済的なコストがかかります。

まず、第一に、僕は、バキバキの WIndowsユーザーです(^^;;; 仕事で多少Linuxサーバーをちょこっと触るぐらい。マックは・・・電気店で触るぐらい・・・。

そんなWindowsユーザーの僕が、自作のアプリを、自分所有のiPhone/iPod Touchで使うには・・・

  • Mac 本体(開発用の実機)。 残念ながらMacOSをVitrualPCやVMWareなどの仮想環境で動かす手段がない。
  • 有償のiPhone Developer Programに登録が必須?
  • Objective-C や XCode をイチから勉強。
  • 公開にはAppleの審査が必要で、配布にはAppStoreしかない

などなど。
それで、立派なアプリが作れるならまだしも、「ちょっとだけ試してみたい」という僕の欲求を満たすためだけに、10万円以上も負担できない。。。

そうなると、もう選択肢が、アンドロイドOSしかない。。。
アンドロイドOSでのアプリの作成は、ほぼコストはゼロ。

  • Windows環境でも十分開発できる。
  • Java言語
  • 作ったアプリはUSB経由で簡単に実機に移動可能
  • 公開に審査なし

あと、Windows Phoneっていう選択肢もあるんだけど・・・
最新のWindows Phone 7を搭載しているスマートフォンってもう出てるのかな???
・・・というか、Windows Phone っていうネーミング自体が、スマートじゃねぇ~し。。。
Windowsってブランドをスマートフォンに持ち込むのは・・・どうかと思いますが・・・。

微妙にカクカク・・・

します・・・。

あ、さっきiPod Touchに音楽を追加しようと同期をかけようとしたら、Touchのバージョンアップ(OS) が・・・。で、サクッとiOS4へ更新完了です。

iPod Touch with iOS4

iBooksを入れて、カメラとかケータイの取説とか、アプリの取説とか、時刻表とか、マイドキュメントに中にあるPDF文書を片っ端から放り込んで同期してみる・・・。

こりゃ便利だ(^^;;; 焦って iPad を買わなくて良かった(笑) 小さい画面でも十分読めるし。

で、僕的に良かったのが、プレイリストの改善。
iTunes側で、いくらフォルダ階層で整理してても、Touch側でそれが再現されない、というiPod Touch最大のヘタレ仕様に、いいかげん、うんざりしてたんだけど、やっと、アップルも聞く耳を持ったのか、プレイリストがやっと使える仕様になりました(^^;;

他には・・・・う~ん・・・なんか画像を多用しているアプリなんかが、ちょっとカクカクする動作が・・・ちょっと気になりますが・・・まぁこれくらいなら許容範囲でしょう。

で、あと一つ、iPod Touchの設定画面に、機内モードのON/OFFの設定が追加されていましたが・・・航空会社からの要請でしょうか???

で、肝心のマルチタスクは・・・う~ん・・・良くわかんないけど、これをマルチタスクというのか?(笑)

・・・と思ったんだけど・・・そんな小さなことを気にしちゃだめなんですよね?・・・なんか、だんだんアップルが、昔のマイクロソフトみたいなことを言い出したな・・・という、気がしないでもない・・・。

財団法人日本相撲協会は公益法人である

あの理事長の記者会見を見ていて、久しぶりに時事ネタを書きたくなった。

相撲にほとんど興味のない僕にとって、数多あるプロレス団体とか総合格闘技系の団体と、どこがちゃうの? っていう程度の認識しかない。

今回の野球賭博騒動も、ことの発端は、内部告発ということらしい。だれかが週刊雑誌にチクッたんだろう。

チクッた奴がどういう立場の人間で、どういう意図があったのか、わからないけど、少なくともチクッた奴がバレたら、フルボッコだろう。。。

チクッたところで誰にも得がない。協会側の人間が告発したら、協会そのものの存続があやうくなる。

博打を張っている側の人間がわざわざ美味しいカモを捨てて、後ろに手が回るようなバカはしないだろう。

協会内部の醜い権力闘争の一つなのか、単なるバカが小銭欲しさにバカをやったか・・・。

まぁ、そんな単純な話じゃないんだろうけど、テレビや新聞などのニュース・ソースでしか、僕らみたいな一市民には情報が得られないので、妄想は膨らむ(笑)

長年続いた慣行なのか、おそらく当事者にとって、「なんで、いまさら?」って思いがあるんじゃないのか。

今回も、真相はおそらく分からないまま、「人の噂も七十五日」ってことになりそうな予感。

相撲興行等に真面目に取り組んでいる人たちが、また、犠牲になるんですね・・・。どの世界でも、上に立つ器じゃない人間が、上に立つと、下の者は、ホント報われませんねぇ・・・。

とりあえず、年内の興行はすべて中止!とかして、「俺たちは本気やねん!」ってところを見せないと・・・蓮舫さんに、仕分けされちゃうよ。。。

というか、蓮舫さんが土俵の上に上がっちゃうよ(笑)

新しいケータイ

先週末、あたらしいケータイ(F-06B)を買って使い出しましたが、これがなかなか曲者で・・・。
WiFi経由でフルブラウザを使えるのは良いんですが・・・んーーーー、この使いづらさは何だ? iPod Touch内臓のSafariに慣れきった身としては、堪えられないほどの使いづらさ!(笑)

まだシステムがソフトウェア的に未完成なのか、ところどころおかしな挙動が・・・。ホントにテストしたのか???と思われるような初歩的なミスも散見でき・・・まぁ・・・そのうちソフトウェアのアップデートがあるでしょうね~、つか、携帯電話事業の統合とか、そんなことをやる前に、自分とこの製品は、せめて完成品を出してチョーよ(ーー;;;

と、まぁ、名もないオイラのしょーもないグチはさておき・・・

概ね、良い感じです。富士通ケータイの指紋認証は僕にとってもう手放せない機能の一つになりつつあります(^^; タッチパネルの動作も意外に反応が速く、i-modeブラウズが快適です。

DOCOMO F-06B

動画もiPod Touch用に変換した動画ファイルを放り込めば再生できるし・・・。万歩計にもなるし(笑)、バッテリーの減りの早さが尋常ではありませんが・・・要らん機能をオフにすればちょっとは長持ちしそうです。

ケータイも3年経つと・・・使い勝手がかなり良くなっているんですねぇ・・・。
ですが・・・ガラケーを買うのも、今回が最後! かと。。。