DllImportを介してアンマネージ関数を呼び出すときにヒープが破損しました

J_COL

C#アプリケーションからC / C ++で記述されたアンマネージDLLを使用しています。dllから次の関数を使用することに興味があります。

    static void StorePath(const std::string& path, wchar_t *out_path,
     int *out_path_length){
      wcslcpy(out_path, c_str_w(path), *out_path_length);
      *out_path_length = path.size();
     }

    int WINAPI BrowseForDirectory(
     int allow_portable, int allow_online,
      wchar_t *t_directory, int *e_directory_length,
       wchar_t *m_directory, int *m_directory_length){
     .
     .
     . //initializing new forms and checking product keys

    StorePath(form->SelectedEDirectory().TopDir(), e_directory,
     e_directory_length);
    StorePath(form->SelectedMDirectory(), m_directory,
     m_directory_length);
    }

ヘッダーファイル:

    #if defined(_WIN32) && !BUILD_WITHOUT_DLLS &&!defined(ECLIPSE_CBUILDER_WORKAROUNDS)
    # if BUILDING_EXPORT_LIBRARY
    #  define EXPORT_DLL __declspec(dllexport)
    # else
    #  define EXPORT_DLL __declspec(dllimport)
    # endif
    #else
    #  define EXPORT_DLL
    #endif

    extern "C" {
        int WINAPI BrowseForDirectory(
         int allow_portable, int allow_online,
          wchar_t *t_directory, int *e_directory_length,
           wchar_t *m_directory, int *m_directory_length)
    }

次に、次の手順を実行して、自分の管理対象のC#クラスライブラリでこの関数を呼び出そうとしています。

    [DllImport("MyDLL.dll", CharSet = CharSet.Ansi)]
    public static extern int BrowseForDirectory(Int32 allowOnline, 
     Int32 allowPortable,
      [MarshalAs(UnmanagedType.LPStr)] StringBuilder eDirectory, 
       ref Int32 eDirLength, 
        [MarshalAs(UnmanagedType.LPStr)] StringBuilder mDirectory, 
         ref Int32 mDirLength);

最後に、次のように呼び出して、C#アプリケーションで使用しようとしています。

    var eDir = new StringBuilder(260);
    var mDir = new StringBuilder(260);
    var eDirLength = eDir.Length;
    var mDirLength = mDir.Length;
    try
    {
        var result = Viewer.BrowseForDirectory(1, 1, eDir, 
         ref eDirLength, mDir, ref mDirLength);
    }
    catch(Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }

ただし、ヒープが破損していましたが、STATUS_STACK_BUFFER_OVERRUN(埋め込みブレークポイントに関するもの)が原因でアプリケーションが終了しています。C ++コードを変更することはオプションではありません。適切なリファレンスとアセンブリがあります。

私は何が間違っているのですか?

デビッド・ヘファーナン

私が見ることができる問題は、あなたの文字セットが一致しないということです。アンマネージコードはテキストをUTF-16として返しますが、p / invokeはANSIエンコードされたテキストを指定します。p / invokeを次のように変更します。

[DllImport("MyDLL.dll", CharSet = CharSet.Unicode)]
public static extern int BrowseForDirectory(
    int allowOnline, 
    int allowPortable,
    StringBuilder eDirectory, 
    ref int eDirLength, 
    StringBuilder mDirectory, 
    ref int mDirLength
);

私はそれc_str_w()が8ビットでエンコードされた文字列取り、nullで終了する配列へのポインタを返すと仮定していますwchar_t

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

クラスのメンバー関数を呼び出すときにクラスのオブジェクトが破損しました

分類Dev

クラス内のいくつかの配列でdelete []を呼び出しているときに「ヒープ破損が検出されました」-C ++

分類Dev

アンマネージDLLから関数を呼び出すときにエラーが発生しました

分類Dev

C-アレイを解放するときにヒープ破損が検出されました

分類Dev

modules.exportsを介してjavascript関数を呼び出すときにエラーが発生しました

分類Dev

CDLLを介して関数を呼び出すときにエラーが発生しました

分類Dev

イベントを介して関数が呼び出されたときに関数に追加のパラメーターを渡す(つまり、:Connect()

分類Dev

iOSアプリからPFCloud関数を呼び出すときにエラーが発生しました

分類Dev

破損したヒープをクリーンアップできますか?

分類Dev

ラップされたオブジェクトの関数ポインタを介してクラスメソッドを呼び出すときにエラーが発生しました

分類Dev

<set>演算子を使用してvoid関数を呼び出すときにエラーが発生しました

分類Dev

pytest.fixture関数は `` yield``を使用できません。代わりに、内部関数/ジェネレーターを記述して返し、コンシューマーがそれを呼び出して反復できるようにします。

分類Dev

PHP を介してストアド プロシージャを呼び出しているときにエラーが発生しました。リテラルがフォーマット文字列と一致しません

分類Dev

別のネットワークを介してクライアントを呼び出すときに、PJSIP呼び出しが失敗する

分類Dev

GLEW関数を呼び出すときに、プロセスが終了コード-1073741515で終了しました

分類Dev

関数を介して呼び出されたときにdbListTablesが警告メッセージを表示するのはなぜですか?(R DBI)

分類Dev

ヒープが破損しています。C#dllimport、delphiPCharの戻り値

分類Dev

ポインタを使用して関数を呼び出すときに、「&」トークンの前に「予期される」) 'エラーが発生しました

分類Dev

std :: systemを介してPythonを呼び出すときにエラーが発生しました

分類Dev

「ユーザーアクション」が終了したときに関数を呼び出す方法は?

分類Dev

複数のスレッドを参照して変数を渡すと、ヒープが破損します

分類Dev

再帰的PHPプログラミング:関数が終了したときに関数を呼び出します

分類Dev

Pythonで関数をループしますが、関数の配列から関数が呼び出されたときに変数を再定義します

分類Dev

…コンポーネントをハイドレイトしようとしたときに、Livewireが破損したデータを検出しました

分類Dev

同じパッケージのプロシージャから関数を呼び出すときにエラーが発生しました

分類Dev

HTMLフォームを介して関数を呼び出すことができません

分類Dev

javascript関数を介してルートを呼び出すことができません

分類Dev

Swift:恒等関数を介して渡されたクロージャを繰り返し呼び出すと、EXC_BAD_ACCESS code = 2が発生します

分類Dev

Swift:恒等関数を介して渡されたクロージャを繰り返し呼び出すと、EXC_BAD_ACCESS code = 2が発生します

Related 関連記事

  1. 1

    クラスのメンバー関数を呼び出すときにクラスのオブジェクトが破損しました

  2. 2

    クラス内のいくつかの配列でdelete []を呼び出しているときに「ヒープ破損が検出されました」-C ++

  3. 3

    アンマネージDLLから関数を呼び出すときにエラーが発生しました

  4. 4

    C-アレイを解放するときにヒープ破損が検出されました

  5. 5

    modules.exportsを介してjavascript関数を呼び出すときにエラーが発生しました

  6. 6

    CDLLを介して関数を呼び出すときにエラーが発生しました

  7. 7

    イベントを介して関数が呼び出されたときに関数に追加のパラメーターを渡す(つまり、:Connect()

  8. 8

    iOSアプリからPFCloud関数を呼び出すときにエラーが発生しました

  9. 9

    破損したヒープをクリーンアップできますか?

  10. 10

    ラップされたオブジェクトの関数ポインタを介してクラスメソッドを呼び出すときにエラーが発生しました

  11. 11

    <set>演算子を使用してvoid関数を呼び出すときにエラーが発生しました

  12. 12

    pytest.fixture関数は `` yield``を使用できません。代わりに、内部関数/ジェネレーターを記述して返し、コンシューマーがそれを呼び出して反復できるようにします。

  13. 13

    PHP を介してストアド プロシージャを呼び出しているときにエラーが発生しました。リテラルがフォーマット文字列と一致しません

  14. 14

    別のネットワークを介してクライアントを呼び出すときに、PJSIP呼び出しが失敗する

  15. 15

    GLEW関数を呼び出すときに、プロセスが終了コード-1073741515で終了しました

  16. 16

    関数を介して呼び出されたときにdbListTablesが警告メッセージを表示するのはなぜですか?(R DBI)

  17. 17

    ヒープが破損しています。C#dllimport、delphiPCharの戻り値

  18. 18

    ポインタを使用して関数を呼び出すときに、「&」トークンの前に「予期される」) 'エラーが発生しました

  19. 19

    std :: systemを介してPythonを呼び出すときにエラーが発生しました

  20. 20

    「ユーザーアクション」が終了したときに関数を呼び出す方法は?

  21. 21

    複数のスレッドを参照して変数を渡すと、ヒープが破損します

  22. 22

    再帰的PHPプログラミング:関数が終了したときに関数を呼び出します

  23. 23

    Pythonで関数をループしますが、関数の配列から関数が呼び出されたときに変数を再定義します

  24. 24

    …コンポーネントをハイドレイトしようとしたときに、Livewireが破損したデータを検出しました

  25. 25

    同じパッケージのプロシージャから関数を呼び出すときにエラーが発生しました

  26. 26

    HTMLフォームを介して関数を呼び出すことができません

  27. 27

    javascript関数を介してルートを呼び出すことができません

  28. 28

    Swift:恒等関数を介して渡されたクロージャを繰り返し呼び出すと、EXC_BAD_ACCESS code = 2が発生します

  29. 29

    Swift:恒等関数を介して渡されたクロージャを繰り返し呼び出すと、EXC_BAD_ACCESS code = 2が発生します

ホットタグ

アーカイブ