西山と申します、WindowsXP+VisualC++6.0(MFC利用)環境で作業しています。
CInternetFileクラスのメンバであるReadStringとWriteStringを使用して、インターネ
ットサーバー上のルートディレクトリにある「Test.txt」というファイルを読み書きする
テスト用のアプリを作成しています。
結果、読み取ることは出来たのですが、WriteStringにて書き込みを行うとDebugメッセ
ージボックスが表示されてしまいます。
ちなみに、ビルドは正常に終了しています。
自分なりに試行錯誤してみたのですがどうしても原因がわかりません。
下記のコードでお気づきの点がありましたらご指導ください。
よろしくお願いいたします。
CInternetSession objIS;
CFtpConnection* ptrFtpConnect;
CString strSurver = サーバー名;
CString strID = ID;
CString strPassWord = パスワード;
ptrFtpConnect = objIS.GetFtpConnection(strSurver, strID, strPassWord);
CString strTemp;
ptrFtpConnect->GetCurrentDirectory(strTemp);
if (strTemp == ルートディレクトリ名){
CString strFileName = Test.txt;
CInternetFile* ptrItFile;
ptrItFile = ptrFtpConnect->OpenFile(strFileName,
GENERIC_WRITE, FTP_TRANSFER_TYPE_ASCII);
if (ptrItFile){
CString strWrite = あいうえお;
ptrItFile->WriteString(strWrite);
ptrItFile->Close();
delete ptrItFile;
}
}
ptrFtpConnect->Close();
objIS.Close();
delete ptrFtpConnect;
delete objIS;
質問者の西山です。
上記記載のコードの20行目を以下のように訂正してみました(引数の型がLPCTSTR型であ
ることを見落としていました)。
LPCTSTR strWrite = あいうえお;
しかし、結果はやはりデバックメッセージボックスが表示されてしまいます。
>しかし、結果はやはりデバックメッセージボックスが表示されてしまいます。
どんなエラーが出てるか記載した方がレスが付きやすいと思います。
CInternetExceptionが投げられている訳ではないのですか?
chamaroさんレスをありがとうございます。
VC++初心者のため、詳細なデバッグ情報を得る方法がわからずご迷惑をおかけします。
メッセージボックスには、英文にて以下のように表示されます。
****************************
Debug Assertion Failed!
Program: D:\TestFTP\Debug\TestFTP.exe
File: inet.cpp
Line 1137
上記に続けて英文にて、
あなたのプログラムが、どうやってassertion failureを引き起こすのかに関する情報
のため、VisualC++ documentation on assertsを見なさい
******************************
失敗の原因についてお気づきの点がありましたら、よろしくお願いいたします。
とりあえず、ASSERTの場合、ひょうじされたソースの箇所を確認してください。
メッセージボックスの継続(だったかな)を押せばそこに飛んでくれます。
たいていASSERTが出る場合は、ユーザが使い方(手順)を間違っていることが多いです。
(VC6が手元にないので、どんなASSERTかは私には確認できません。)
Blueさんレスをありがとうございます。
メッセージボックスに表示されている「inet.cpp」というファイルは、当方のプロジェク
ト内には存在していません。
初心者の見当はずれな推測かもしれませんが、ファイル名から推測するとMFC関係のフ
ァイルではないかとも思うのですが。
しかしdll内にcppファイルが存在するのでしょうか?
inet.cpp は $(VC)/MFC/SRC/INET.CPP にある MFC のソース。
> しかしdll内にcppファイルが存在するのでしょうか?
DLL のソースファイルということだ。
んで、本題。単に MSDN マニュアルを読んでいないだけだと思われる。
ttp://msdn2.microsoft.com/en-us/library/1st6z7sc(VS.80).aspx
WriteString は呼べないと (Write なら呼んでいい) と明記されているぞ。
tetrapodさん、レスをありがとうございます。
MSDNマニュアルを読んではいたのですが、読み方が浅く、WriteやReadが使えるならば
WriteStringやReadStringも使えるものと勝手に誤解していました。
ご指摘のおかげで、WriteとReadを使って読み書きともにできるようになりました。
>DLL のソースファイルということだ
DLLファイルとなった時点で特別な形式のファイル化され、cpp形式はなくなるものかと
誤認していました。大変勉強になりました。
ご指摘ありがとうございました。
上記の内容に関連して、次の2点について教えていただけないでしょうか。
1 MSDN文中の「OpenFile を呼び出して Close を呼び出すまでは、アプリケーションが
呼び出せるのは CInternetFile::Read、CInternetFile::Write、Close、または
CFtpFileFind::FindFile だけです。」の部分について、「Closeを呼び出すまでは上記4つ
のメンバ関数以外は呼び出せない」と解するならば、Closeを呼び出した時点で接続が切
断されるので、これはすなわち、FtpConnectionではWriteStringとReadStringは使用で
きないということなのでしょうか。
2 tetorapodさんのレスをいただく以前に、以下のコードで、Closeを呼び出す前に
ReadStringを使用してサーバー上のテキストファイルを読み出すことが出来たのです
が、上記のMSDN文の内容に対し、このことはどう理解すればよいのでしょうか。
CInternetSession objIS;
CFtpConnection* ptrFtpConnect;
CString strSurver = FTPサーバー名;
CString strID = ID;
CString strPassWord = パスワード;
ptrFtpConnect = objIS.GetFtpConnection(strSurver, strID, strPassWord);
CString strFileName = ./TestText1.txt;
CString strRead;
CInternetFile* ptrItFile;
ptrItFile = ptrFtpConnect->OpenFile(strFileName, GENERIC_READ,
FTP_TRANSFER_TYPE_ASCII);
ptrItFile->ReadString(strRead);
ptrItFile->Close();
ptrFtpConnect->Close();
objIS.Close();
delete ptrItFile;
delete ptrFtpConnect;
delete objIS;
追加質問となり恐縮ですが、よろしくお願いいたします。
>>DLL のソースファイルということだ
>
>DLLファイルとなった時点で特別な形式のファイル化され、cpp形式はなくなるものかと
>誤認していました。大変勉強になりました。
補足で書いときますと、
DLLファイル自体はコンパイルされて機械語に変換され、ライブラリ化されていますので
DLLその物にソースが含まれているわけでは有りません。
これらのDLLのソースファイルも開発環境の一部として提供されているので
ライブラリのソースファイルもきちんとインストールしていれば、
参照する事が可能になっていると言う話です。
プラットホームSDKなんかも提供ライブラリのソースも一緒に提供してくれていたと
思います。
なので、繰り返しますが、インストール時に入れていれば、貴方の開発環境の中に
ソースファイルも入っているはずですので確認は可能と言う事です。
>2 tetorapodさんのレスをいただく以前に、以下のコードで、Closeを呼び出す前に
>ReadStringを使用してサーバー上のテキストファイルを読み出すことが出来たのです
>が、上記のMSDN文の内容に対し、このことはどう理解すればよいのでしょうか。
このケースに限らずですが、出来たからと言って保障された動作と言うわけでは無いので
仮に動いたとしてもMSが保障していない手段であれば、使うべきでは無いと思います。
保障されていない動作と言うのは今、動いていても次のバージョンでは動かなくなる
可能性があると言う事になります。ですから、保障されていない動作ではあるが、
偶々今の実装では動いていると認識するのが正しいのではないでしょうか。
まあ、MSDNにも間違った記述があったりするので絶対そうなのかといわれると厳しい
ですが、基本的に保障されていない方法は今動いていてもいつ動かなくなるか分からない
から使わないと言うのが安全だと思います。パッチがあたって動かなくなったなんて
事もまったく無いとは言えませんしね。
PATIOさん、具体的に説明をしていただきありがとうございました。
理解かつ納得することが出来ました。
レスをいただいた皆さん本当にありがとうございました。