前回の続きなのだが、Window MobileがUNCを扱えると知った。そうなると、出来るだけ明示的なマウントをせずにすごしたくなるのが人情というものである。
で、gsGetFile である。gsGetFile の gsGetOpenFileName() ダイアログは、ファイル名を直接入力できる。ここに、UNCパスを直接ぶち込んであげれば、アプリケーションはそのパスを開くことがわかった。(アプリケーションによってはエラーが出る可能性があります)
UNCパスを得るには、GSFinderで「パスをコピー」してgsGetFile にペーストすればよい。しかし、ここでもやはり、ブラウズしたい、というのが人情であろう。
試したところ、ファイル名(名前:)のところに、ディレクトリ名をいれてOKを押せば、ディレクトリの内容を表示することがわかった。「名前:」に「\\server\share」と入れてOKを押すと、ネットワークのディレクトリをブラウズすることが出来た。OKを押さなければいけない。なぜかReturnキーでは表示してくれなかった。
家のネットワークに直接つなぐ時には、BUFFALO の LUA-KTX とこのドライバーを使っている。
インストールして何もいじらないfedora 6のsmbをW-ZERO3 (GSFinder) からマウントしようとしたら、うまくいかなかった。つながるようにするためには、samba側に次の設定が必要だった。
wins support = yes
Access a Samba share from Windows Mobile 5.0
この設定をしたのは数カ月前なので、どのようなエラーだったかはおぼつかないが、上のページに書いてあるような症状だったと思う。
さて、ごりぽん さんの GSFinder for W-ZERO3 を使っているのだが、ネットワークドライブのマウントには、「ネットワーク接続の割り当て…」を使うのだと思っていた。で、このダイアログにいつも同じネットワークパスを入力するのが面倒だなあと思っていた。
ところが、ふと思いついて、GSFinder の画面上部のパス Combo BoxにUNCパス(\\server\share って奴ね)を入れてみたら、そのままマウントしてくれるではないか。今までの苦労はなんだったんだろう。ものを知らないとはこういう事である。(2008-12-12 追記:久しぶりにフルリセットしたので試したら、”\Network”フォルダを作っておかなくてもUNCでマウントできます。いいじゃん。)
じゃあ、いつものサーバーをアクセスするには、とサーバーパスへのショートカットを作ってみたが、これは失敗。ショートカットのあるフォルダを表示するだけで、マウントしに行ってしまう。
で、正解は、「移動」メニューの「ユーザーパス」に UNC パスを記述しておく事だろう。これでメニューから一発でサーバーにアクセスできるようになった。
ところで GSFinder は、楽にサーバーをマウントさせてくれるのだが、標準の「ファイル エクスプローラ」は、接続設定がなってないとか文句を垂れる。ま、普段使わないからいいんだけど。ファイル エクスプローラでマウントするには、次の設定が必要だった。
- 設定→接続→ネットワーク カード で [ネットワーク カードの接続先] を「社内ネットワーク設定」にする
- 設定→接続→接続 で [詳細設定] タブの [ネットワークの選択] を押して、[インターネットに自動的に接続するプログラムの接続方法] と [プライベート ネットワークに自動的に接続するプログラムの接続方法] の両方を「既定の社内ネットワーク設定」にする
- 再起動する
- ファイル エクスプローラ の パスを開く→新しいパス… で UNC を入力
って、これじゃ全く使い物にならない設定じゃないか!
追記: その後、試してみたら、ネットワーク カード で [ネットワーク カードの接続先] を「インターネット設定」、 [詳細設定] タブの [ネットワークの選択] を押して、[インターネットに自動的に接続するプログラムの接続方法] と [プライベート ネットワークに自動的に接続するプログラムの接続方法] の両方を「既定のインターネット設定」にすることでもマウントできました。MSさんの考えることはどうもよくわかりません。
続き:画餅展覧会 » gsGetFileでUNCを開く
前回のエントリーで、すっきりしなかった Warning C4530だが、さらに判った事を書いておく。
eVC3.0 は、try/catch/throw をサポートしていない。eVC4.0 は、「コンパイラー単独では」try/catch/throw をサポートしている(要 /GX オプション)。しかし、C++例外を使うには、コンパイラーサポートとともに、ランタイムのサポートが必要である。で、PocketPC 2003 SE SDK はC++例外のサポートが無い。Windows Mobile 5 SDK からサポートされているようである。
結論として、eVC4.0では、C++例外は、「使いようが無い」。
PocketPC 2003 SE SDK にはSTLがついてくるが、これも、try/catch/throw を使わない限りにおいて、使用できる。try/catch/throw を使うと、リンクエラーが出て実行ファイルを作ることは出来ない。
例:
#include <windows.h>
#include <vector>
static const int tab[] = {
123, 456, 789,
};
static const int tabsize = sizeof(tab) / sizeof(tab[0]);
std::vector<int> vec(&tab[0], &tab[tabsize]);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
int i = vec[1];
return i;
}
このコードは、/GXオプションをつけないと、C4530警告が出るが、生成されたバイナリーは正しく実行される。しかし vec[1] (例外を投げない) の部分を vec.at(1) (例外を投げる)に変えると、LNK2001やらLNK2019やらが出て、実行ファイル自体が生成できない。メッセージによると std::exception のコンストラクターやデストラクター、type_infoの仮想関数テーブルがないとかいっているようである。