こんにちわ。
↓の続きです。
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200806/08060060.txt
前回、無事VCからExcelマクロを起動させることはできたのですが、ワークブックを開く
時に
> //WorkBookを追加する
> WorkbooksPtr pBooks = pXL->Workbooks;
> _WorkbookPtr pBook = pBooks->Open(C:\\Work\\BOOK2.XLS);
と、フルパスをベタ書きするのは気持ち悪いので
GetCurrentDirectoryでカレントディレクトリを取得して
//Openの引数の型が_bstr_tな為、char[]->CString->_bstr_t に変換
char chCurrentDir[MAX]; //MAX:256
CString csCurrentDir;
_bstr_t bsCurrentDir;
GetCurrentDirectory( sizeof( chCurrentDir ), chCurrentDir );
csCurrentDir = chCurrentDir; //char[]->CString
csCurrentDir.Replace( _T(\\), _T(\\\\) ); //(C:\Work)->(C:\\Work)
csCurrentDir += \\\\Debug\\\\BOOK2.XLS;
bsCurrentDir = csCurrentDir.AllocSysString(); //CString->_bstr_t
//WorkBookを追加する
WorkbooksPtr pBooks = pXL->Workbooks;
_WorkbookPtr pBook = pBooks->Open( bsCurrentDir );
このように実装してみたんですが、Openのところで例外発生してしまうようです。
パスは確認したので合ってるはずなんですが…何が原因なのか教えていただけるとありが
たいです。
よろしくお願いします。
目的のパスが
C:\Work\Debug\BOOK2.XLSだとするなら
>csCurrentDir.Replace( _T(\\), _T(\\\\) ); //(C:\Work)->(C:\\Work)
は必要ないのでは?
>csCurrentDir += \\\\Debug\\\\BOOK2.XLS;
も\\\\ではなく\\では?
これだと目的のファイルの場所が
C:\\Work\\Debug\\BOOK2.XLS
になっちゃいますよ?
と さん
回答ありがとうございます。
> >csCurrentDir.Replace( _T(\\), _T(\\\\) ); //(C:\Work)->(C:\\Work)
> は必要ないのでは?
>
> >csCurrentDir += \\\\Debug\\\\BOOK2.XLS;
> も\\\\ではなく\\では?
確かにそのとおりでした。。。
Replaceの行をコメントアウトし、
\\\\を\\に直したらうまく動作しました。
パスをベタで指定する時は
C:\\Work\\Debug\\BOOK2.XLS
でOKだったので変数を引数として渡す際にも\\としなければならないという思い込みだ
ったようです。
エスケープ文字についてもっと知らないといけないですね。
それと、ファイルダイアログ等でファイルを指定したりする度に
GetCurrentDirectoryで得られるカレントディレクトリが変わってくるのも混乱の元だっ
たようです。
何事も先入観を持って臨むのは良くないという事を再確認です。
ありがとうございました。
また解決にチェック入れ忘れました。
すいません。。