- PR -

Directory::GetCurrentDirectory() が Directory クラスのメンバではないと警告される

1
投稿者投稿内容
パットン
会議室デビュー日: 2004/08/15
投稿数: 11
投稿日時: 2004-08-30 00:16
Visual C++.NET のManaged C++ でWindow フォームアプリケーションを作成しています。

namespace ListPloration
{
using namespace System::IO; <=== (1)
・・・略・・・
public __gc class Form1 : public System::Windows::Forms::Form
{
・・・略・・・
private: String* strDirectory; <=== (2)
・・・略・・・
private: System::Void Form1_Load(略)
{
・・・略・・・
strDirectory = Directory::GetCurrentDirectory(); <=== (3)
}
}
}

のコードですが、コンパイルをすると (3) の部分に対して

『C2039: 'GetCurrentDirectoryA' : 'System::IO:irectory' のメンバではありません。』と
『C2660: 'GetCurrentDirectoryA' : 関数に 0 個の引数を指定できません。』

というエラーが発生してしまいます。GetCurrentDirectory() は'System::IO:irectory' のメンバのはずなのに、なんでこのようなエラーがでるのかわかりません。
コード中 (1) の部分で namespace を指定していますし、(2) で CurrentDirectory を格納する String 変数を宣言しています。
何が悪いかを指摘してくださると助かります。
どうか、よろしくお願いします。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-08-30 01:04
諸農です。

--確認方法--
新規でプロジェクトを作成して、単純にボタンとラベルだけを
貼り付けたフォームを用意する。
ボタンのクリックイベントハンドラに以下のように記述する。

コード:
private: System::Void button1_Click(System::Object *  sender, System::EventArgs *  e)
{
     label1->Text = System::IO::Directory::GetCurrentDirectory();
}



これが問題無くビルドできれば、元のプロジェクトのどこかに
問題があると考えられます。


引用:

『C2039: 'GetCurrentDirectoryA' : 'System::IO::Directory' のメンバではありません。』と
『C2660: 'GetCurrentDirectoryA' : 関数に 0 個の引数を指定できません。』



プロジェクトのどこかで同名のWin32APIの宣言していませんか?
Win32APIのGetCurrentDirectory()関数では、DWORD nBufferLengthと
LPTSTR lpBufferの2つの引数をとりますが。


_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-08-30 09:07
引用:

パットンさんの書き込み (2004-08-30 00:16) より:


 OK Webの質問にあったのですが、コードをヘッダファイル内に書かないと使用する文字コードがずれてコンパイルされるようです。

strDirectory = Directory::GetCurrentDirectory(); <=== (3)
C2039: 'GetCurrentDirectoryA' : 'System::IO:Directory' のメンバではありません。

GetCurrentDirectoryメソッドのはずが、GetCurrentDirectoryAメソッドに変わっていますよね。UNICODE用のライブラリをリンクしているのに、ASCII用のライブラリ名を使ってしまっています。


 残念ながら、あちらでも回答はついていませんし、私も見つけていません。
パットン
会議室デビュー日: 2004/08/15
投稿数: 11
投稿日時: 2004-08-30 23:29
Jubeiさん、Jittaさん、ありがとうございました。

Jubeiさんの言われたとおり、別の単純なプロジェクトを作ってためしたところ、ビルドが成功してディレクトリも取得できました。

Jittaさんのご指摘にあったGetCurrentDirectoryAの「A」は見落としていました。
よくよく考えると今回の件に限らず、いろいろな場面で本来のメソッド名に「A」という文字が付いてエラーになることはよくありました。コードをいじくっているうちにエラーがとれていたため、今まではあまり気にしていませんでした。Jittaさんのご指摘は非常に勉強になります。

「UNICODE用のライブラリをリンクしているのに、ASCII用のライブラリ名を使ってしまっています」
というご指摘についてですが、Jittaさんには申し訳ありませんが、UNICODE用のライブラリとASCII用ライブラリについて説明してくださると助かります。
私にとってはじめて聞く内容で、ライブラリのアクセスのことまで話が及ぶとは思ってもいませんでした。

今後、このようなことで誤りをおこさないため、どうかよろしくお願いします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-08-31 10:16
引用:

パットンさんの書き込み (2004-08-30 23:29) より:

「UNICODE用のライブラリをリンクしているのに、ASCII用のライブラリ名を使ってしまっています」
というご指摘についてですが、Jittaさんには申し訳ありませんが、UNICODE用のライブラリとASCII用ライブラリについて説明してくださると助かります。
私にとってはじめて聞く内容で、ライブラリのアクセスのことまで話が及ぶとは思ってもいませんでした。


 Win32APIの・・・MSDN(VS.NETドキュメント)の、キーワードタブを開き、フィルタ条件を「プラットフォームSDKドキュメント」にします。検索する文字列に「getcurrentdirectory」を入力してEnterキーをクリックすると、プラットフォームSDKのGetCurrentDirectoryの説明が出てきます。で、下の方を見ると、対応情報というところに、「Unicode:Windows NT/2000はUnicode版とANSI版を実装」とあります。これです。
 Unicode版は関数名の後にWがつきます。ANSI版はAがつきます。ん?あ、ASCII用ってのは間違ってます。失礼。これの使い分けは、引数の型によって、自動的に行われます。LPWSTRの時はUnicode、LPSTRの時はANSIです。が、.NETから使うと、Stringクラスを渡すので、どうやって指定するのかわからないんですよね(;^_^A アセアセ…

 検索タブで、フィルタを「.NET Framework ドキュメント」にして、検索する文字列を「lpwstr」にして検索すると、マーシャリングとかプラットフォーム呼び出しというタイトルを持った記事が20ほど見つかると思います。これらも参考に。。。
パットン
会議室デビュー日: 2004/08/15
投稿数: 11
投稿日時: 2004-09-01 07:21
Jittaさんありがとうございました。
Unicode版ライブラリとASCII版ライブラリが何なのかをわかっただけでもありがたいです。これを手がかりに自分なりにもうすこし調査してみるつもりです。

あと、Jubeiさんのご指摘で
『プロジェクトのどこかで同名のWin32APIの宣言していませんか?』
に対して回答していなかったのは失礼だったと思います。
実は、このことは最初に確認してみました。
「GetCurrentDirectory」で検索オプションを「現在のプロジェクト」にして検索して、念入りに確認しましたが、他に使っているところはありませんでした。
しかし、Directoryクラスのメソッドとして使う前に、同じところで Win32 の関数として使っていました。もしかしたら、それが何らかの影響を及ぼしたかもしれません。
まるち
会議室デビュー日: 2005/03/05
投稿数: 1
投稿日時: 2005-03-05 16:43
#undef GetCurrentDirectory

でWin32の方はしかとっ

[ メッセージ編集済み 編集者: まるち 編集日時 2005-03-05 16:54 ]
1

スキルアップ/キャリアアップ(JOB@IT)