<   2009年 02月 ( 23 )   > この月の画像一覧
(.Net)mailto でccやbccが指定できない
@IT プログラムからブラウザやメーラを起動するには?を読みながら、mailto を使ってアプリケーションからメーラーを立ち上げる部分を作成していました。

この mailto を使って To , Cc , Bcc や本文、件名等を指定できるとあったので、試した見たところ、メーラーが Cc や Bcc を無視してしまいます。
メーラーは Becky! 2.50 です。

で、調べてみると、どうやら RFC 準拠かつ脆弱性対策のようです。
意図しない送信先に送ってしまうことを防ぐためのようですね。

意図しない宛先にメールを送ってしまう問題に対応したメールソフトが続々公開 で取り上げられてました。

どうやら、JVN がこの問題を脆弱性として取り上げてから各メーラーが続々と修正されたっぽいです。
メールクライアントソフトにおける mailto URL scheme の不適切な解釈で、この問題の情報が公開されてますね。
上記JVNの情報によると、問題となっているCc,Bccは、RFCの
・メールクライアントは、mailto URL scheme の記述をもとに作成したメールの全体をユーザに確認させるべきである
・とくにヘッダについては宛先だけでなく、その他のヘッダについても明示的に表示すべきである
・メール配送に関係するヘッダを mailto URL scheme の記述に基づいて設定することは不適切である
という仕様にも反しているようです。

ただし、MSのOutlook系統はCc,Bccが含まれれば常に表示する仕様で、RFCに準拠してるので、mailto で Cc,Bcc指定できるっぽいです。

この辺はどのメーラーでも統一される仕様にしてほしかったですよね。
さて、Cc,Bcc の送信どうしたものか。。。
(結局、上の指示によりOutlook系のシェアが高いことを理由に mailto を使う方針となりました。Becky!ユーザである自分としては残念な結果でしたが。。)

ちなみに、この問題はこの記事の著者が報告したっぽいです。
[PR]
by jehoshaphat | 2009-02-24 19:15 | .Net開発 | Trackback | Comments(0)
ExcelのデータをAccessにコピペしようとすると。。。
Excel でセルを選択し、コピー。Access で表示しているテーブルに貼り付けしようとすると下記のようなエラーになりました。
e0091163_2152494.jpg


「データが破損しているため、貼り付けできません。」っていったい何がおきたんだっ!?と思って調べたら、どうやらMSのアップデートがまずいようです。
こちらのブログを参考にさせていただくと、問題のアップデートはExcel 2007 セキュリティ更新プログラム (2008 年 12 月 9 日) KB958437のようです。
この問題に関する情報も[MS08-074] Excel 2007 セキュリティ更新プログラム (2008 年 12 月 9 日) についてで掲載されてました。
今のところはこの問題については、調査中と書いてます。

セキュリティ関係のアップデートなので、パッチをアンインストールするのは怖いため、いったんテキストエディタにコピペして、それを Access に貼り付けるようにしました。

ったくこんなんで10分無駄にしました。MSにはこまったもんです。
[PR]
by jehoshaphat | 2009-02-23 21:53 | 豆知識 | Trackback | Comments(0)
(ニュース)ITmedia:ミニノートはノートPCと食い合うか?
ミニノートはノートPCと食い合うか? (1/2) - ITmedia News

今や一般人にも認知されるようになったネットブック市場についての話題です。
この記事は海外発なので、DellやHP寄りの視点になっていますが、参考にはなりますね。

ネットブックのブームによってよく見かけるようになったが、この記事のテーマでもある市場の変化です。
つまり、ネットブックが今までのノートPC市場を侵食しているのではないかという問題ですね。

この記事によると、市場調査会社IDCの一アナリストはこう述べています。
「1年あまりの間に、NetbookはLinuxとSSDを搭載したデバイスから、従来のノートPCのような、フル機能Windowsと120G バイトHDDを搭載したシステムに進化した。ここで2つの影響が見られた。多くのNetbookはより堅固に高価になり、ノートPCはNetbookと同じ価格帯になってきた。(従来のノートPCがNetbookに奪われた市場シェアは)多くの人が心配しているよりはずっと少ない――10~15%かもしれない」

確かに初期のネットブックは Linux ベースがメインで、本当にネット上のWEBアプリケーションにつなぐための端末的な位置づけでしたよね。(日本では Linux モデルはほとんど見かけませんでしたが)
それが、時期を追うごとに Windows 搭載のフル機能PCに近付いて行ってる気は自分もします。
特に Vista 採用モデルでこの状況が顕著にでてるのではないでしょうか。
逆に価格安価重視の XP 搭載モデルは、Microsoft のライセンス(ULPC)の制約のせいで、どの PC もハードウェアは似たり寄ったりなものとなっています。

フル機能PCに近付いていってるという意味では、若干既存のローエンドPCのシェアを奪っているといえるかもしれません。

しかし、自分としては、このようなジャンルのPCは、少々既存のノートPCのシェアを奪っているとしても必要だと考えます。
自分の知り合いには、簡単な文章作成とWindows用データ閲覧ソフトやDVD,mp3視聴のためだけにそこそこなPCを購入している人が多くいます。
そのような人たちはほとんど素人さんで、PCを触る頻度も非常に低く、機能を求めていません。そのような層にこそネットブックやネットトップの Windows 版がいいのではないかと思います。(光学ドライブは外付けになるかもしれませんが。)

一部のアナリストやハード・ソフトベンダーはネットブックがハードやソフトの進化(ハードスペックが上がったりビジュアルが豪華になったり)に反しているということや、粗利率が低いので利益にならないというような危機感を持っているようです。
確かに世の中ネットブックだらけになったら、大変でしょうが自分はそうはならないと思います。
(余談ですが、Intelはネットブック向けAtomがバリュー価格帯のCPUまで浸食してることに危機感を感じてるっぽいです。詳細は後藤弘茂氏のコラム(IntelがIntelを食う共食いを起こしたAtomプロセッサ)参照。)

ユーザにはそれぞれのニーズがあるわけですから、とにかく安いのを求める人、パフォーマンスを求める人、どちらもバランスよく求める人などいろいろなタイプに合わせたPCジャンルを用意してもいいはずですよね。

特にこの不景気な時代はより安価なものに流れる傾向がありますし。。

ということで、自分としてはこのジャンルが定着し続けることを願います。

が、メーカー側はどうも、なんとかこの市場を抑制したいみたいですね。
特に Microsoft なんぞは Windows 7 において、Starter Edition たるものを設け、これがネットブック用だと言っています。
細かい制約はまだ分かりませんが、同時稼働可能アプリが3本やAeroがないことなどいくつかありそうです。
(このあたりの事情は元麻布春男氏のコラム(ネットブック用Windows 7にアップグレードパスを)参照。)
確か Intel も Atom 搭載のネットブックで、ハードの制限してた気もします。


そういえば、何週間か前に NHK のクローズアップ現代でネットブックが紹介されてました。
圧倒的に台湾製がおおく、その低価格の前に日本メーカー(取材は富士通)が苦戦している現状が取り上げられてました。
最初日本メーカーはネットブックに否定的でしたが、このブームの前に参入せざるを得なくなった感じですね。
しかし、日本メーカーも安価作戦が台湾メーカーに比べ難しいのであれば、ただ単にネットブックというのではなく、VAIO Type P みたいな日本の技術力をアピールしたミニノートも、もっと作っていいと思います。

しかし、VAIO Type P ほしいですね。Vista はどうも嫌いなので、Windows 7 β いれて使ってみたいですね。(もうすでにいろんなところでこれやってるみたいです。たとえばITmedia:「VAIO type P」でWindows 7 日本語β版を走らせるとか。。)
ちなみに、今このブログに表示してる Tux が持ってるのも VAIO Type P です。
ソニー(VAIO) VAIO typeP P70H VistaHomeBasic ワンセグ ガーネットレッド VGN-P70H/R
e0091163_21222229.jpg


[PR]
by jehoshaphat | 2009-02-23 21:26 | 思ったこととかニュースとか。。 | Trackback | Comments(0)
(MySQL)スクリプトファイルからクエリを実行する方法
基本的なことですが、ついつい忘れてしまうのでメモメモ。

MySQLで、スクリプトファイルからクエリを実行する方法です。

mysqlクライントより下記のようにすることでできるようです。

mysql> source スクリプトファイル名;

参考:
テキストファイル(スクリプト)のSQL文を実行する
[PR]
by jehoshaphat | 2009-02-19 18:32 | SQL | Trackback | Comments(0)
年収アップには C# 習得が欠かせない?
@IT:求人数はJava、年収はC#がトップ――ワークポートが調査 で、人材紹介会社が調査した求人件数・年収増加のランキングがでてました。

これ見ると、求人数では JAVA , C がダントツ高いですね。
おそらく、エンタープライズ系の大規模開発は JAVA , 組み込み系では C という感じなんでしょうね。
やっぱりエンタープライズ系で .Net はなかなか JAVA の牙城を崩せないみたいですね。

興味深いのは言語毎年収上昇ランキングです。
ここでは、C# の市場価値が一気にあがっていることが分かりませすね。
年収は .Net 系言語が比較的高いようです。

JAVA もここ数年触ってないですし、 C# に至ってはさっぱしで時代に取り残されてるのをひしひしと感じる自分でした。

特に C# は今やってる VB.Net と使うクラスライブラリは一緒なので比較的移行しやすいと思うので、ちょっとこれからはやってこうかなと思ってたりしてます。
[PR]
by jehoshaphat | 2009-02-19 00:07 | 思ったこととかニュースとか。。 | Trackback | Comments(3)
過去の x86 CPU が tom's hardware で紹介されてた
どっかのIT系ニュースサイトで紹介されてました。
INTELのプロセッサ:http://www.tomshardware.com/reviews/intel-cpu-history,1986.html
AMDのプロセッサ: http://www.presence-pc.com/actualite/photoreportages/13-amd-processeurs-x86.html

自分が知ってるのは、Mendocino コアからなので、最初のほうのx86元祖系CPUは物珍しかったですね。
初代8086プロセッサがクロック 10MHz 、最大メモリ 1MB ってある意味すごいですね。

個人的に印象に残ってるプロセッサと言えば、まずは PentiumⅡ ベースの Celeron Mendocino と、PentiumⅢ Coppermine ですかね。
最初に買ったPC(VAIO L330)は Mendocino コアの Celeron でメチャメチャ遅かったので、中古ショップで買ってきた Coppermine ベースのCPUに代えました。
が、当時はハードウェアの知識が全然なかったため、FSB 133MHz*6.5 の PentiumⅢ 866Mhzを買ってしまったんですよね。チップセットは 440BX だったので FSB は 100Mhz です。なので、結局 100*6.5 で 650MHz しか出ないという苦い思い出がありますね。

あと、tom's hardware で見たCPUクーラー排除の動画実験を実際に自機でやったこともありましたね。さすが PentiumⅢ でアプリのフリーズくらいで済みましたが、今考えれば無謀極まりないですね。
なお、その動画今でも残ってました。 http://www.tomshardware.com/reviews/hot-spot,365-6.html

ちょっと懐かしさを感じる記事でした。
[PR]
by jehoshaphat | 2009-02-19 00:06 | ハードウェア | Trackback | Comments(0)
YouTube:飛行機乗り遅れで絶叫女性がITmediaニュースに・・
飛行機乗り遅れで「絶叫」女性、YouTubeで人気動画に - ITmedia News

ITmediaの速報で載ってました。
確かに、乗り遅れたら軽いパニックにはなるかもしれんですが、ここまできたら迷惑この上ないですよね。。。

しかし、よく警備の人に連行されなかったなと思います。

自分も似たような場面に遭遇したことが。。
何年か前に仁川国際空港から日本に帰るときに、出国審査のところで、隣のゲートで審査された家族(韓国人)の子供が、引っ掛かったらしく、それに激しく抗議した父親がつい審査官に手を出してしまったのです。
手を出された審査官も逆上して、外に出てきて報復。まあ、激しい殴り合いとなってましたね。
母親もギャーギャーわめいていて、隣のゲートにいた自分にはハタ迷惑でした。
結局、警備隊みたいな人がすぐ来て、連れ去れていっちゃいましたけど。。。

まあ、やっぱり海外人は気性が激しいというか、逆に日本人がおとなしすぎるのか分かりませんが、あれは結構カルチャーショックでしたね。

あの時の場面撮ってたらよかったなー。

しかし、ITmediaの上部にある「ブログに書く」ボタン初めて使ってみましたが、結構便利ですね。
[PR]
by jehoshaphat | 2009-02-18 01:42 | 思ったこととかニュースとか。。 | Trackback | Comments(0)
(.Net)DataGirdViewとTabControl の組み合わせで、DataGridViewのスクロールバーが無効化される現象
これは.Netの仕様なのかバグなのか分かりませんが、かなり悩まされました。

下記の条件のときにDataGridViewのスクロールバーが無効にされるという意味不明な現象が発生します。

・DataGridView は TabControl の上に配置する。
・DataGridView が配置されているタブをいったん表示し、その後別タブを表示。
・DataGridView が Enabled = False のとき DataGridView をデータソースにバインドする。
・DataGridView が表示されていないタブで DataGridView の Enabled = True にする。
・DataGridView が配置されているタブを表示する → DataGridView のスクロールバーが無効に。

具体的には下記のようなコードで再現できます。(Visual Studio のデザイナで、タブコントロールとその上(TabPage2)に DataGridView を配置しておく)
DataGridView のデータソースとして、MDBから取ってきた DataTable とします。このMDBは(.Net)DataGridViewでの入力チェックはCellValidatingだけではダメで使ってたやつとします。
Public Class Form1
'DataTable
Private mTable1Dtbl As New Database1DataSet.table1DataTable()
'TableAdapter
Private mTable1Adp As New Database1DataSetTableAdapters.table1TableAdapter()
 
''' <summary>
''' フォームロード
''' </summary>
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'スクロールバー無効バグ調査 DataGridViewのEnabledを無効にする
Me.DataGridView1.Enabled = False
End Sub
 
''' <summary>
''' スクロールバー無効バグ調査 Button2 の押下イベントハンドラ
''' <summary>
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
'DataTableにDBの情報を取得し、DataGridViewにバインドさせる
'このとき、DataGridView.Enable は False の状態
mTable1Adp.Fill(mTable1Dtbl)
Me.DataGridView1.DataSource = mTable1Dtbl
 
'バインド後に Enabled を True に。
Me.DataGridView1.Enabled = True
End Sub

End Class

DataGridView は TabPage2 上に配置しておきます。
まず、TabPage2 を表示。フォームロード時にグリッドは無効かつ何にもバインドしていないので、データは表示されません。
e0091163_1122986.jpg


そして、いったん TabPage1 を表示し、Button2 を押下し、グリッドのバインド、有効化します。
e0091163_1125826.jpg


で、 TabPage2 を押下すると、スクロールバーが無効に。。ただカーソルキー使うとセルを移動できます。
e0091163_1131971.jpg



で、この解決法ですが、DataGridView をデータソースにバインドするとき(グリッドに表示用データがセットされるとき)に、Enabled を True にすることくらいしかないようですね。

ということで、Button2_Click メソッドを下記のように書き換えました。これだと問題なくうまく動きます。

''' <summary>
''' スクロールバー無効バグ調査 Button2 の押下イベントハンドラ
''' <summary>
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
'バインド前に Enabled を True にすると問題おきない
Me.DataGridView1.Enabled = True
'DataTableにDBの情報を取得し、DataGridViewにバインドさせる
mTable1Adp.Fill(mTable1Dtbl)
Me.DataGridView1.DataSource = mTable1Dtbl
End Sub


当たり前ですが、DataGridView を GourpBox 等のコンテナ上に配置している場合、そのコンテナの Enabled を True にしないといけないので要注意です。
この場合は再帰処理すればいいかもしれません。一応下記に親のコントロールから Enabled を True にするメソッドを上げておきます。

''' <summary>
''' 指定されたコントロールの親がEnableをFalseにしていたら解除する
''' </summary>
''' <param name="ctl">検査するコントロール</param>
''' <returns>EnabledがFalseの最も親のコントロール。Falseのコントロールがない場合はNothigを返す</returns>
''' <remarks></remarks>
Private Function ParentControlEnableTrue(ByVal ctl As Control) As Control
If ctl.Enabled Then
Return Nothing
End If
If ctl.Parent IsNot Nothing AndAlso Not ctl.Parent.Enabled Then
Return ParentControlEnableTrue(ctl.Parent)
Else
ctl.Enabled = True
Return ctl
End If
End Function


これがバグならさっさと直してほしいですね。

参考:
@IT BBS :DataGridのスクロール表示について
@IT BBS :C# Tabコントロール上のDataGridViewが崩れる
[PR]
by jehoshaphat | 2009-02-18 01:14 | .Net開発 | Trackback | Comments(1)
(VC++).Net Framework対応アプリインストール前に動かすチェックツール作ってみた
(VC++).Net Framework がインストールされているかどうかを調べる方法で書いてる要件を満たすため、過去4回いろいろ書いてきましたが、それらのまとめとして、実際の C++ のコードを載せておきます。

動きとしては、.Net Framework 2.0 がインストールされているかどうかの確認。
されていなければ、インターネットにつながるかどうかの確認。
つながらなければその旨を表示するというごくシンプルなものです。
(しかし、シンプルとはいえ文字列・ポインタ系ではまって時間を無駄にしてしまいましたが。。)

プロジェクトは Visual Studio 2008 で、ダイアログベースの MFC アプリケーション、CSocket を使うようウィザードでチェックを入れます。
プロジェクト名は CheckFramework とします。

■CheckFramework.cpp
// CheckFramework.cpp : アプリケーションのクラス動作を定義します。
//
 
#include "stdafx.h"
#include "CheckFramework.h"
#include "CheckFrameworkDlg.h"
 
...省略

// 唯一の CCheckFrameworkApp オブジェクトです。
 
CCheckFrameworkApp theApp;
 
 
// CCheckFrameworkApp 初期化
 
BOOL CCheckFrameworkApp::InitInstance()
{
...省略
 
CString strTitle = _T(".Net Framework インストールチェック");
// .Net Framework 2.0 インストールチェック
bool bNetfx20Installed = IsNetfx20Installed();
 
if ( ! bNetfx20Installed ) {
// .Net がインストールされてないときは、MSのサイトにつながるかチェック
CString msg ;
if ( ! IsConnectNetwork( &msg ) ){
CString errMsg ;
errMsg ="インターネットに接続できないため、動作に必要な .Net Framework 2.0 をダウンロードできません。\n";
errMsg += "インタネットに接続するか、.Net Framework 2.0 をインストールしてから再度お試しください。\n";
MessageBox( NULL , errMsg + msg , strTitle , MB_OK | MB_ICONERROR );
return FALSE;
}
}

//setup.exeの存在確認
CFileFind find;
//自分のexeのパス確認
TCHAR path[_MAX_PATH];
::GetModuleFileName(NULL,path,sizeof path);
 
//自分のexeのパスから、ディレクトリ名までのインデックスを探す。
int i = 0;
for ( i = wcslen(path) ; i > 0 ; i--)
{
if ( path[i] == '\\' ){
break ;
}
}
 
TCHAR path2[sizeof path];
_tcsncpy( path2 , path , i + 1 );
path2[i + 1] = '\0';
//setup.exeのパスを生成
CString strFilePath = path2;
strFilePath += _T("setup.exe") ;
 
if( find.FindFile( strFilePath ) ){
//setup.exeを起動
ShellExecute( NULL , _T("open") , strFilePath , NULL , NULL , SHOW_OPENWINDOW );
}else{
CString msg = _T("インストールエラー: setup.exe が見つかりません。");
MessageBox( NULL , msg , strTitle , MB_OK | MB_ICONERROR );
}

...省略

// ダイアログは閉じられました。アプリケーションのメッセージ ポンプを開始しないで
// アプリケーションを終了するために FALSE を返してください。
return FALSE;
}
 
 
/******************************************************************
Function Name: IsConnectNetwork
Description: 指定されたホストにたいして通信ができるかどうかを判断
Inputs: CString *msg 参照渡の文字列。メッセージを返す
Results: true 指定されたURL、ポートのホストにアクセスできた。
false アクセスできなかった
******************************************************************/

bool IsConnectNetwork(CString *msg)
{
 
BOOL bret;
 
// ソケットを作成
CSocket socket;
bret = socket.Create();
if( bret == FALSE)
{
*msg = "\n詳細:ソケット作成に失敗しました。";
return false;
}
 
CString strSv ;
strSv = "www.microsoft.com";
 
// サーバーへ接続する(ローカルを指定しています。)
bret = socket.Connect( ( strSv ), 80);
if( bret == FALSE)
{
*msg = "\n詳細:";
*msg += strSv ;
*msg += " に接続できませんでした。";
return false;
}
socket.Close();
return true;
}


■IsInstalledFrameworkLib.cpp
#include "stdafx.h"
 
//MSのサンプル使用。詳細は http://jehupc.exblog.jp/9620350/
 
// Constants that represent registry key names and value names
// to use for detection
const TCHAR *g_szNetfx20RegKeyName = _T("Software\\Microsoft\\NET Framework Setup\\NDP\\v2.0.50727");
const TCHAR *g_szNetfxStandardRegValueName = _T("Install");
const TCHAR *g_szNetfxStandardSPxRegValueName = _T("SP");
const TCHAR *g_szNetfxStandardVersionRegValueName = _T("Version");
/******************************************************************
Function Name:IsNetfx20Installed
Description:Uses the detection method recommended at
http://msdn.microsoft.com/library/aa480243.aspx
to determine whether the .NET Framework 2.0 is
installed on the machine
Inputs: NONE
Results: true if the .NET Framework 2.0 is installed
false otherwise
******************************************************************/

bool IsNetfx20Installed()
{
bool bRetValue = false;
DWORD dwRegValue=0;
 
if (RegistryGetValue(HKEY_LOCAL_MACHINE, g_szNetfx20RegKeyName, g_szNetfxStandardRegValueName, NULL, (LPBYTE)&dwRegValue, sizeof(DWORD)))
{
if (1 == dwRegValue)
bRetValue = true;
}
 
return bRetValue;
}
 
/******************************************************************
Function Name:RegistryGetValue
Description:Get the value of a reg key
Inputs:HKEY hk - The hk of the key to retrieve
TCHAR *pszKey - Name of the key to retrieve
TCHAR *pszValue - The value that will be retrieved
DWORD dwType - The type of the value that will be retrieved
LPBYTE data - A buffer to save the retrieved data
DWORD dwSize - The size of the data retrieved
Results:true if successful, false otherwise
******************************************************************/

bool RegistryGetValue(HKEY hk, const TCHAR * pszKey, const TCHAR * pszValue, DWORD dwType, LPBYTE data, DWORD dwSize)
{
HKEY hkOpened;
 
// Try to open the key
if (RegOpenKeyEx(hk, pszKey, 0, KEY_READ, &hkOpened) != ERROR_SUCCESS)
{
return false;
}
 
// If the key was opened, try to retrieve the value
if (RegQueryValueEx(hkOpened, pszValue, 0, &dwType, (LPBYTE)data, &dwSize) != ERROR_SUCCESS)
{
RegCloseKey(hkOpened);
return false;
}

// Clean up
RegCloseKey(hkOpened);
 
return true;
}


■stdafx.h
...省略
 
/******** IsInstalledFrameworkLib.cpp 関連のヘッダファイル start ***********/
#include <stdio.h>
#include <windows.h>
#include <tchar.h>
#include <strsafe.h>
 
#ifndef SM_TABLETPC
#define SM_TABLETPC86
#endif
 
#ifndef SM_MEDIACENTER
#define SM_MEDIACENTER87
#endif
 
// Function prototypes
bool IsNetfx20Installed();
bool RegistryGetValue(HKEY, const TCHAR*, const TCHAR*, DWORD, LPBYTE, DWORD);
/******** IsInstalledFrameworkLib.cpp 関連のヘッダファイル end ***********/
 
/******** ネットワーク接続チェック関連のヘッダファイル start ***********/
bool IsConnectNetwork(CString *msg);
/******** ネットワーク接続チェック関連のヘッダファイル end ***********/


久しぶりの C++ なんで、文字列操作あたりは汚いかもしれませんが。。。

(余談:MCPのロゴ載せてみました。といっても、70-215の試験なんで今さらという感じですが。。アメリカのMCPメンバーサイトに登録してなかったんで、MSの日本法人に問い合わせて Access Code 再発行してもらいました。)
[PR]
by jehoshaphat | 2009-02-17 22:03 | C/C++開発 | Trackback | Comments(3)
(VC++)自身のアプリケーションファイルのexeファイルのパスを取得する方法
exeと同じ場所にある別のexeをキックする要件だったので、ShellExecute で引数に ".\キックするexe名" としたかったのですが、これだとどうもカレントディレクトリから見た相対パスになるので、このexe自体が別のアプリから呼ばれてカレントディレクトリが変わっていた時は、意味がないようです。

ということで、自身のアプリケーションファイルのexeファイルのパスを取得する方法です。

MFCだと、自身のアプリケーションクラスのGetModuleFileName関数を使えるとできるようです。
こんな感じです。
// CApp 初期化
BOOL CApp::InitInstance()
{
....省略
//自分のexeのパス確認
TCHAR path[_MAX_PATH];
::GetModuleFileName(NULL,path,sizeof path);
}

非常に簡単ですね。

追記:
GetModuleFileName関数は Windows API となるので、MFCじゃなくてもWin32アプリケーションでも使えます。
(#include  が必要となりますが。。)

参考:
iniファイルをexeと同じパスで使用する方法(VC++6.0)
MSDN:GetModuleFileName
[PR]
by jehoshaphat | 2009-02-16 02:42 | C/C++開発 | Trackback | Comments(0)