HoME以前


りき丸くんの工作日記

1999/2/16(Tue)

無料パソコンがひそかに話題になっているようですね。
画面の広告を見ることに同意すれば、パソコンをプレゼントしてもらえるというもの。
idealab!の子会社のFree-PCってとこの企画なんだけど、コンパックとかの$500クラスの製品をくれるらしい。
しかもNetZeroとかいうプロバイダとの無料インターネット接続も提供されている。
その見返りというのか、ユーザはその会社へ年齢とか趣味など個人データを提供しなければならない。
そのデータに基づいてデスクトップに広告が常時表示されるという仕掛けのようだ。

これって日本から登録できないのかなぁ。


1999/2/10(Wed)

JStorage Ver2.00の開発へ着手
Ver2.00ではタスクトレイへの常駐を行うよう修正するつもりであった。
ところが、うまくいかない。
通常のWin32ではタスクトレイへのアイコン表示をしたことはあった。
まずCEでタスクトレイへのアイコン表示がうまくいかなかったのは
16x16のサイズのアイコンを表示するようにしなかったため
タスクトレイには空白のスペースだけが表示されなかった。
もちろんこれはLoadImage()を使って、明示的に16x16サイズを
読み込んでやれば解決した。
さて、これがいまだに解決していないのだが
ShowWindow(SW_HIDE)としてやっても、HIDEしてくれないのだ。
そのため、実行するとタスクトレイへアイコンが表示されるのだが
メインのウィンドウもそのまま表示されたままなんていう間抜けな状態になってしまっているのだ。
とりあえずいろいろと試してはいるのだが...
この問題が解決次第、JStorage Ver2.00を公開することにしよう。


1999/1/29(Fri)

はじめてのVC++を使ってのCEアプリのリモートデバッグをした。
手順としては、
1.まず持っているCEをデスクトップへ接続。
2.VC++でターゲットを、接続したCEのDebugモードに設定する。
-> これは、VC++のツールバーから選択できる。
3.Buildメニューから、Build MyAPP...(F7でも良い)を選択する。
-> この際に、デバッグ用のDLLなどがコピーされることもあるので
場合によっては、時間のかかることがある。
4.あとは、VC++の通常のデバッグと同様にデバッグできる。
-> アプリケーションの操作自体は、CEマシン上でできる。
CEマシンへコピーされた実行ファイルは、Startメニューに
表示される。

メニューからBuild MyApp...と選択した場合、DLLのコピーなども
想定して容量のチェックを行うようで、CE側の残りの容量が
少なかった場合、「Insufficient space on the target device」と
メッセージが表示されることもある。

そのような場合は、Batch Buildでアプリケーションのビルドを行い
Buildメニューの「Update Remote Output File」を選択する。
すると、ビルドした実行ファイルのみコピーされる。

リモートデバッグを行う際には、mfcのデバッグ用DLLとCEMON.EXEが
CE側にコピーされる。
これらのファイルはかなりサイズも大きいので注意した方がよい。


1999/1/28(The)

JStorageには、未だに複数起動を防止するための処理を行っていないことが判明。
本当は、Ver1.00からVer1.10にバージョンアップした際に盛り込むつもりであったのだが
すっかり忘れてしまっていた。
これまでのMFCプログラミングでは下のような感じで
複数起動を防止することができた
アプリケーションクラスのInitInstance()に

HWND hWndCap;
CString strCaption;
HANDLE hPrevMutex = OpenMutex(MUTEX_ALL_ACCESS,FALSE,_T("h_MYAPP_PrevInstance"));
if(hPrevMutex != NULL) //* もし、オープンできればすでにアプリケーションが起動している
{
CloseHandle(hPrevMutex);
strCaption.LoadString(AFX_IDS_APP_TITLE);
hWndCap = FindWindow(NULL,strCaption);
if( hWndCap != NULL ){
// アクティブ化する
}
return FALSE;
}
hExeCheckMutex = CreateMutex(FALSE,0,_T("h_MYAPP_PrevInstance"));
のように処理を記述する。
また、同じクラスのExitInstance()にて
ReleaseMutex(hExeCheckMutex);
と、Mutexを解放しよう。

また、同クラスに
HANDLE hExeCheckMutex;
と、メンバを追加しておく。

ちなみにOpenMutex(), CreateMutex()のそれぞれの第3引数の文字列は
作るアプリケーションによって変更しておくことを忘れずに。
全部同じにしていると、別のアプリケーションの起動が
できなくなってしまうからである。

という感じで、記述できたのだが
WinCEプログラミングでは同じ事ができるのだろうか。

調べてみると、OpenMutex()ってのはWinCEでは使えないようだ。
OpenMutex()ってのは、すでにCreateMutex()によりMutexが作成されている場合だけ
成功し、Mutexオブジェクトのハンドルを取得できる。
これがない...
いきなりCreateMutex()すれば良いのか?...
そんなわけないよなぁ。

とりあえず分からないけど、CreateMutex()だけで試してみよう。
分からないならとりあえずトライトライ!

(10分後)

やっぱ、だめだぁ。
Mutexのチェックしないとやっぱりだめだよなぁ。
英語のヘルプなんでちょっと自信がないんだけど
ヘルプには
名前付きMutexがすでに存在すれば、CreateMutex()は存在するハンドルを返して
GetLastError()がERROR_ALREADY_EXISTSを返すと書いてある。
だから、こうしたわけ。
if((hExeCheckMutex = CreateMutex(NULL, 0, _T("h_MYAPP_PrevInstance"))) == NULL){ // NULLだったらエラー
return FALSE;
} else {
if(GetLastError() == ERROR_ALREADY_EXISTS){ // すでに起動している
strCaption.LoadString(AFX_IDS_APP_TITLE);
hWndCap = FindWindow(NULL,strCaption); //* APのハンドル取得
if( hWndCap != NULL ){
//* アクティブ化
}
}
}
けど、どんどん起動できるようで
GetLastError()からは、ERROR_ALREADY_EXISTSは返ってこない。
やば...
どうすんだろ。

ちょっと調べる時間が必要だ。
ってことで、WinCEでの多重起動防止テクニック研究は
つ・づ・く...


1999.1.20(Wed)

MFCプログラミングでちょっとした小技を発見。
ステータスバーというのは、ほとんどのWindowsユーザが知っているだろうが
Windowsの下に出ているバーで、エクスプローラだとファイル数だのディスクの空き容量だのが
表示されているやつである。
ここにアイコンの表示なんて洒落たことができるなんてらしい。
まずは、ステータスバーに表示してみたいアイコンを作成しよう。
とりあえず試してみたい人は、すでにあるIDR_MAINFRAMEリソースのアイコンを利用してみよう。
後は、ステータスバーの作成後に下のようにするだけ。

CStatusBarCtrl& sb = m_wndStatusBar.GetStatusBarCtrl();
sb.SetIcon(0,(HICON)::LoadImage(AfxGetResourceHandle(),
MAKEINTRESOURCE(IDR_MAINFRAME),
IMAGE_ICON,
16,16,
0));

下のような感じで書けばいけそうなんですが、これだとアイコンが
32x32で表示されてしまうため、ステータスバーに入りきらなくなってしまいます。
ステータスバーがアイコンのサイズの変更をしてくれるわけではないため
自分で入りきるように指定しないとならないので、ご注意。
CStatusBarCtrl& sb = m_wndStatusBar.GetStatusBarCtrl();
sb.SetIcon(0, AfxGetApp()->LoadIcon(IDR_MAINFRAME));


1999.1.19(Tue)

今日は、Libretto70の出荷状態への復元手順について書いてみることにします。
1年前のボーナスで念願のLibretto70を手に入れたのですが、さすがに
1年も使い込むとディスクの掃除が必要。
ってなわけで、復元だ!と行きたかったところなんですが
残念なことにおいらの持っているCD-ROMドライブは、Panasonicの
しょぼい倍速のやつ。
困ったことに標準でついてきたリカバリディスクでは、サポートされていない。
この買ったときに付いてくるリカバリディスクってのが
FDを指して、CD-ROMを入れておくと出荷状態まで自動的に復元してくれるという
ものなため、サポートされていないCD-ROMドライブを使って復元させるには
ちょっとしたテクニックが必要。

Librettoの他のモデルの事情は知らないので
以降の手順は、Libretto70+ノンサポートCD-ROMドライブという
環境での復元手順という、何とも限定された情報である。
関係ない人は、以降を読んでもあまり意味があるとは思えません。
どうもすいません。

1.リカバリCD起動ディスクAの1枚目を別のFDにコピーする。
2.a:\coreldrvに自分の持っているCD-ROMドライブのドライバをコピーする。
3.CONFIG.SYSを編集する。

6行目から8行目の先頭に「rem 」を記述する。
これは元々の記述をコメントアウトするため。
そして、9行目、10行目を追加する。
9行目でASPIマネージャのロード(PCMCIAカードをPCで利用できるようにするため)
10行目でCD-ROMデバイスドライバのロード
ただし、9行目、10行目のドライバ名は、接続しようとしている
CD-ROMドライブによって違うので、ここだけはマニュアルでも
引っぱり出して調べて書いてください。
おそらく大抵のマニュアルには、CONFIG.SYSのサンプルとかが
書いてあると思うので。

line6: rem DEVICE=C:\TOSPCE.EXE /SLOT=1 /IOBASE=300 /MEMBASE=C8
line7: rem DEVICE=C:\ASPI500.SYS ENABLER PORT=300 CIS_SEG=C800 MHz=40 SYNC=NO
line8: rem DEVICE=C:\CUNI_ASP.SYS
line9: DEVICE=C:\ASPI365.SYS /port=300 /mem=CE00
line10: DEVICE=C:\KMECD.SYS /d:MSCD001

4.作成したFDをFDドライブに入れて、PCを立ち上げ直す。
5.初期インストールソフトウェアの復元メニューが表示される。
6.メニューから(1),(2),(3)を選択する。
(1)の場合は、パーティション設定後に再起動される。
7.「CD-ROMの選択」画面が表示される。
8.(1)の「東芝製PCカードSCSI(SCSC200A/SCSC200B)を選択する。
9.ドライバのコピーが終了したら、1度マシンの電源を切って
  フロッピーディスクを取り出しCD-ROM装置をセットします。
  CD-ROM装置には「Product Recovery CD-ROM」を入れておきます。
10.準備ができたら電源を入れる。
11.CD-ROMからファイルがコピーされ、あとは購入時の状態で立ち上がり
  Windows95のセットアップが始まります。

これで完了。
うまく行ったら、作成したFDは大事にオリジナルのリカバリFDと一緒に
保存しておきましょう。


1999.1.12(Tue)

さぁて、JStorageも完成して公開したし、今日は何するかねぇ。
とりあえず、Honey B'z Bros.のHPをGEOで作っていたんだけど、GEOは
メンテが大変になりそうなんで、Niftyへの移行を検討。
Niftyのメンバーズページはタダだし、いいかなぁと真面目に検討中。

と、結局このまま、Geoで公開突入〜〜!!!!
PsPC-MLでお知らせしたら、いきなりみなさん訪問してくれるではないですか。
いやぁ、ありがたいありがたい。

公開にあたり、WindowsCE Toolkit for VC++6で作ったJStorageで必要な
MFCのDLLはどうするかと検討していたが、配布しても問題ないもののようなので
JStorageも一気に公開!
Toolkitがβ版だっただけにちょっと不安だったが、良かった良かった。

ここのネタを絶やすことのないよう、CEプログラミングにも
精を出さないといかんなぁ。

...結局1日HTMLとの挌闘で終わってしまった。

明日からは、JMoneyの作成に取りかかることにしようか
それとも何か面白いネタあるかなぁ。


1999.1.9(Sat)

さぁ〜て、今日はRAMの情報も見れるようにJStorageを改造。
GetDiskFreeSpaceEx()でディレクトリパスに「\\」を指定してやれば良いだけなので簡単簡単。
...と思ってみたのだが、これだとStorage Memoryに割り当てている部分の情報しか取れない。
RAM全体の情報が必要なものかなぁ。
個人的にはStorageMemoryの情報さえ分かれば十分だと思っているのだが
JStorageを使ってみようと思う人はどこまでの情報が必要だと思うのだろうか。
まぁいいや、とりあえずRAMのStorage Memoryの情報のみの表示にしてリリースしちゃおう。
後は、要望があったら変更すればいいし。

よし、リリースに向けて配布の準備だ。
さて、ここで疑問が1つ。
JStorageはMFCを使って開発してきた。
そしてこれまで使ってきたのは、WindowsCE ToolKit for VC++6というβ版だったのだが
これに付いてきているMFCCEのDLLは再配布できるものなのだろうか...
や、や、やばい、これはリリース延期の危機!
とりあえずドキュメントをあさってみることにしよう。
分からん...
どこにも書いてない気がする。
それともおいらの英語力が未熟なのか。
仕方ない来週あっくんに聞いてみよ。


1999.1.8(Fri)

これまで雑誌などでCEプログラミングなどを目にはしていたが開発環境もなく
実機もなく、手を出そうともしていなかったが
11月にハワイでNino320のゲット!
12月にこのHPのオーナーであるあっくんよりWindows CE ToolKitのクリスマスプレゼント。
と、何の言い訳もできない環境が揃ってしまったりき丸。

しかし、本日1/8をもってついにCEプログラミングを開始。
ついでに日記でもつけてみようかと...
でもって、そのうちCEプログラミングテクニックとして
まとめてみようかな。

手始めにRAMやStorage Cardの容量を確認するためのツール「JStorage」の
開発をスタート。

BuildするとそのままActive Configurationで指定しているプラットフォームでの
実行まで進んでしまう。
BuildメニューからBatch Buildを実行すればコンパイルのみできるんだとさ。

TabCtrlでページのタイトルが化けてしまうでないの。
-> 以下のコードで「Page1」というタイトルを持ったタブページが表示される
と考えていたのだが...
Win32では問題なかったコードだったのに...
TCITEM tcItem;
tcItem.mask = TCIF_TEXT;
tcItem.pszText = "Page1";
m_TabCtrl.InsertItem(0, &tcItem);
しかし、表示されたタブページに表示されているテキストが
化けてしまうのである。
tcItem.pszText = "Page1";
ところが、この部分を
tcItem.pszText = TEXT"Page1";
とすると表示が期待通りにされるではないか。
TEXT()マクロは、ANSIコードをUnicodeへ変換するためのマクロです。
WindowsCEではUnicodeのみがサポートされているため、このマクロを
使用してUnicode文字列を使用しなければならないということが判明。

RAMやStrageCardの容量を確認するには
GetDiskFreeSpaceEx()を使用するんだよと、あっくんが教えてくれた。

BOOL GetDiskFreeSpaceEx(LPCWSTR lpDirectoryName, //調べるディレクトリパス名
PULARGE_INTEGER lpFreeBytesAvailableToCaller, //呼び出し側スレッドに関連付けられているユーザーが利用できる、ディスクの空き容量が格納される
PULARGE_INTEGER lpTotalNumberOfBytes, //ディスクの総容量が格納される
PULARGE_INTEGER lpTotalNumberOfFreeBytes ); //ディスクの空き容量が格納される
と、こんな感じのを使うらしい。
ULARGE_INTEGERなんて初めてみるんだが、一体なんだろう。
試して見てみると、LowPartってメンバに入っているのがそれぞれの値みたい。

グループボックスが最全面に表示されてしまい、コントロールが後ろに隠れ
表示されないじゃないの。
-> 画面を変更したため、グループボックスを使わなくなったため
解決には至っていない。後日機会のある時に改めて調べることにした。

とりあえずStorage Cardの情報を表示するだけで1日かかっちまった。
RAMの情報も表示するようにしようと思ったら、またまた手こずっちまってる。
そしたら、あっくんはStorage Cardの情報が見れるだけでいいから
JStorage Ver0.50としてリリースしようと言う。

ちょっと直しかかったのを元に戻そうと思ったんだけど
起動したらアプリケーションエラーなんて起こしてしまうように変身してしまった。

が〜〜〜ん...
もうや〜めた。
今日はもう寝る。


HoME以前 GigaHit