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

カトゥ

dllをインポートしました。他のすべての部分は機能しますが、インポートされたメソッドの文字列の戻り値は次のようになります。

***。exeの0x7748EA5F(ntdll.dll)で未処理の例外:0xC0000374:ヒープが破損しています(パラメーター:0x774C4270)。

それでも文字列が返されますが、後でデバッグが難しい他のエラーが発生するのではないかと心配しています。私がテストしたことから、それは何でもあり得るように感じます、それはこれを引き起こしています。

これは私のインポートコードです:

[DllImport("kernel32.dll")]
public static extern IntPtr LoadLibrary(string dllToLoad);
[DllImport("kernel32.dll")]
public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName);

[UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Ansi)]
private delegate String GetStringDelegate(int handle, int index);

private static GetStringDelegate getString { get; set; }

var addressOfGetString = NativeMethods.GetProcAddress(_handle, "GetString");
getString = (GetStringDelegate)Marshal.GetDelegateForFunctionPointer(addressOfGetString, typeof(GetStringDelegate));

使用法

getString(Handle, 1);

これは機能しますが、エラーが発生します。デバッグ中に「続行」を押すだけで、デバッグを処理して結果を表示できます。結果は正しいです。

これはdelphidllで行われる方法です

function GetString(Hnd,Index : Integer) : PChar; stdcall;
begin
 Result:=TControl(Hnd).Stack.GetString(Index);
end;

整数、倍精度浮動小数点数、ブール値などの同じ種類のコードがあり、dll内の他のすべてがエラーなしで機能します。ですから、それはある種のオーバーフローや間違ったサイズのメモリ割り当てを生み出すと思います。

注:コンソールアプリケーションを作成すると、エラーが発生せずに失敗します。デバッガーなしでコンソールを実行すると(ctrl + f5)、エラーなしで動作します。フォームアプリケーションからこれを呼び出すと、ヒープエラーが生成されます。

TL; DR; このコードは機能しますが、ヒープエラーを示し、int、boolなどを返すことは完全に機能します。

デビッド・ヘファーナン

ap / invoke関数の関数戻り値として文字列を返す場合、マーシャラーはそのメモリを解放する責任を負います。これは、メモリがCOMヒープに割り当てられていることを前提としていますCoTaskMemAlloc文字列がその要件を満たしていません。

  • Delphiコードを変更して、そのようにメモリを割り当てることができます。
  • 戻って手動でマーシャリングIntPtrするMarshal.PtrToStringAnsiために使用できます。その場合、メモリを解放する必要があるかどうか、および解放する必要がある場合はどのように解放する必要があるかという問題が残ります。
  • COM BSTRを返すこともできますが、これはDelphiでoutパラメーターとしてのみ機能し、関数の戻り値では機能しません。WideStringを相互運用の関数の戻り値として使用できないのはなぜですか?を参照してください
  • 呼び出し元にメモリを割り当てて、呼び出し先にメモリを設定させることができます。

確かにあなたのコードを完全に理解することはできませんが、ローカル変数がPChar(s)どこsにあるかを返していても驚かないでしょうこれは、解放されたメモリのアドレスを返すことを意味します。

ここで重要なのは、呼び出し先から呼び出し元に文字列(または実際には配列やその他の動的構造)を渡すことは、単純な値型を渡すよりもはるかに複雑であるということです。これをどのように行うかを再検討する必要があります。

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

Cのヒープが破損していて、理由がわかりません

分類Dev

c ++の「ヒープが破損しています」エラーを修正する方法は?

分類Dev

newまたはdeleteを使用していないのに、なぜヒープが破損するのですか?

分類Dev

ヒープ破損が発生しているのはなぜですか?

分類Dev

ヒープの破損が検出されました| C

分類Dev

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

分類Dev

C ++での画像HTTPアップロードが破損しています

分類Dev

iOSエラー:ヒープの破損が検出され、空きリストが破損し、ガード値が正しくありません:0

分類Dev

c ++ delete [] 2D配列によりヒープが破損しました

分類Dev

ヒープの破損により、C ++でエラーが検出されました

分類Dev

変数の周りのスタックが破損していますc ++

分類Dev

C#dllimportネイティブメソッド呼び出しでパラメーターのメモリを解放する必要がありますか?

分類Dev

匿名の右辺値への参照が破損しています

分類Dev

文字列の配列がない場合、「ヒープが破損しています」とクラッシュします

分類Dev

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

分類Dev

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

分類Dev

ヒープの破損が検出されましたか?

分類Dev

AngularJsアプリのダウンロードが破損しています

分類Dev

シリアルポートへの着信値が破損しているか欠落している場合があります

分類Dev

BTRFS:ノードが破損しています。キーの順序が正しくありません

分類Dev

BTRFS:ノードが破損しています。キーの順序が正しくありません

分類Dev

c ++プログラムの実行時にヒープが破損しましたエラー

分類Dev

破損した関数の戻り値

分類Dev

C:変数「s」の周りのスタックのエラーが破損していました

分類Dev

C:変数「s」の周りのスタックのエラーが破損していました

分類Dev

ヒープに割り当てているにもかかわらず、値が破棄されます

分類Dev

エラーc ++アサーションの失敗ヒープの破損が検出されました

分類Dev

LU分解のnxn行列を取得している間のヒープの破損

分類Dev

メモリ割り当て中のヒープの破損

Related 関連記事

  1. 1

    Cのヒープが破損していて、理由がわかりません

  2. 2

    c ++の「ヒープが破損しています」エラーを修正する方法は?

  3. 3

    newまたはdeleteを使用していないのに、なぜヒープが破損するのですか?

  4. 4

    ヒープ破損が発生しているのはなぜですか?

  5. 5

    ヒープの破損が検出されました| C

  6. 6

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

  7. 7

    C ++での画像HTTPアップロードが破損しています

  8. 8

    iOSエラー:ヒープの破損が検出され、空きリストが破損し、ガード値が正しくありません:0

  9. 9

    c ++ delete [] 2D配列によりヒープが破損しました

  10. 10

    ヒープの破損により、C ++でエラーが検出されました

  11. 11

    変数の周りのスタックが破損していますc ++

  12. 12

    C#dllimportネイティブメソッド呼び出しでパラメーターのメモリを解放する必要がありますか?

  13. 13

    匿名の右辺値への参照が破損しています

  14. 14

    文字列の配列がない場合、「ヒープが破損しています」とクラッシュします

  15. 15

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

  16. 16

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

  17. 17

    ヒープの破損が検出されましたか?

  18. 18

    AngularJsアプリのダウンロードが破損しています

  19. 19

    シリアルポートへの着信値が破損しているか欠落している場合があります

  20. 20

    BTRFS:ノードが破損しています。キーの順序が正しくありません

  21. 21

    BTRFS:ノードが破損しています。キーの順序が正しくありません

  22. 22

    c ++プログラムの実行時にヒープが破損しましたエラー

  23. 23

    破損した関数の戻り値

  24. 24

    C:変数「s」の周りのスタックのエラーが破損していました

  25. 25

    C:変数「s」の周りのスタックのエラーが破損していました

  26. 26

    ヒープに割り当てているにもかかわらず、値が破棄されます

  27. 27

    エラーc ++アサーションの失敗ヒープの破損が検出されました

  28. 28

    LU分解のnxn行列を取得している間のヒープの破損

  29. 29

    メモリ割り当て中のヒープの破損

ホットタグ

アーカイブ