1

次の関数があります。これは、フォルダーが存在するかどうかを教えてくれることを願っていますが、呼び出すと、このエラーが発生します-

パラメータ 1 を 'System::String ^' から 'std::string' に変換できません

関数 -

#include <sys/stat.h>
#include <string>

bool directory_exists(std::string path){

    struct stat fileinfo;

    return !stat(path.c_str(), &fileinfo);

}

呼び出し (ユーザーがフォルダーを選択するフォームを保持する form.h ファイルから) -

private:
    System::Void radioListFiles_CheckedChanged(System::Object^  sender, System::EventArgs^  e) {

        if(directory_exists(txtActionFolder->Text)){                
            this->btnFinish->Enabled = true;
        }

    }

これを修正する方法を教えてくれる人はいますか?ありがとう。

4

3 に答える 3

2

管理された C++/CLI 文字列 ( System::String^) からstd::string. このための暗黙的な変換は提供されていません。

これを機能させるには、文字列変換を自分で処理する必要があります。

これはおそらく次のようになります。

std::string path = context->marshal_as<std::string>(txtActionFolder->Text));
if(directory_exists(path)) {  
     this->btnFinish->Enabled = true;
}

そうは言っても、この場合は、完全にマネージド API に固執する方が簡単かもしれません。

if(System::IO::Directory::Exists(txtActionFolder->Text)) {  
     this->btnFinish->Enabled = true;
}
于 2013-03-01T23:02:38.940 に答える
1

CLR 文字列を STL 文字列に変換して C 文字列に変換し、POSIX エミュレーション関数で使用しようとしています。なぜそのような合併症が発生するのですか?とにかく C++/CLI を使用しているので、そのまま使用してSystem::IO::Directory::Existsください。

于 2013-03-01T23:03:48.580 に答える
0

これを機能させるには、マネージド型System::Stringからネイティブ型に変換する必要がありますstd::string。これには少しのマーシャリングが含まれ、2 つの別個の文字列インスタンスが生成されます。MSDN には、文字列のさまざまな種類のマーシャリングの便利な表があります。

http://msdn.microsoft.com/en-us/library/bb384865.aspx

この特定のケースでは、次のことができます

std::string nativeStr = msclr::interop::marshal_as<std::string>(managedStr);
于 2013-03-01T23:03:11.450 に答える