2

文字列パスを使用して XML ファイルを呼び出す C++ プロジェクトに取り組んでいます。C++ をコンパイルすると、すべてが完全に機能し、プロジェクトで必要な XML ファイルを使用できるようになりました。

C# GUI を使用する必要があったため、C++ ファイルからすべての関数を呼び出すラッパーを作成しました。両方のプラットフォーム間でデバッグした後に 1 つの問題が発生します。c# は、ファイルを呼び出すための文字列パスを認識しません。指定されたパスが見つからないというエラーが表示されます。両方のプラットフォーム間で有効な文字列パスを送信する方法を知っている人はいますか?

前もってありがとう、カロライナ

    int ClassUnmanaged::ReadFile(string path_to_file)
     {
        int status = XMLClass->ReadConfigFile(path_to_file);

        if(status)
        {
           return status; //Error
        }

        else
        {
           return 0;
        }
    }

C++ クラスの Wrapper.h

    public __gc class Wrapper
    {

      public:   Wrapper(void);
      public:   ~Wrapper(void);
             /** Unmanaged pointer to Class Unmanaged API
               *    
               */
      private:  ClassUnmanaged__nogc* pointerUnmanaged;

          public: int NewReadfile(string path_to_file);
    }

ラッパー.cpp

    int Wrapper::NewReadFile(string path)
    {
        pointerUnmanaged->ReadFile(path);//here i access to my class unmanaged
    return 0;
     }

UI.cs

UI.cs では、C++ が使用する文字列型のため、関数 NewReadfile をラッパーから呼び出すことができません。これを解決する方法はありますか?

4

1 に答える 1

1

NewReadFile メソッドを public に変更してから、C# が認識している型を入力として受け取るように変更する必要がありますSytem::String(必要に応じて、新しいマネージ C++ 構文を使用して古い構文に適応させる必要があります)。

int Wrapper::NewReadFile(System::String^ path)
{
    char* pathAsCharArray = (char*)(void*)Marshal::StringToHGlobalAnsi(str);
    try
    {
        std::string pathAsStdString(pathAsCharArray);
        pointerUnmanaged->ReadFile(pathAsStdString);
    }
    finally
    {
        Marshal::FreeHGlobal(pathUnmanaged);
    }

    return 0;
 }

この概念を説明する「Visual C++ で System::String* から Char* に変換する方法」という名前の KB 記事があります。基になる API が Unicode をサポートでき、新しい構文を使用する場合、変換を行うためのより良い方法は次のようなものです。

pin_ptr<const wchar_t> pathAsCharArray = PtrToStringChars(path);
std::wstring pathAsStrign(pathAsCharArray);
于 2011-08-01T11:57:15.553 に答える