C#からC++ DLL(borland c builder)を使用しようとしています。DllImport StackOverflowException
#include <vcl.h>
#include <windows.h>
#include <fstream.h>
#pragma hdrstop
#pragma argsused
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
return 1;
}
//---------------------------------------------------------------------------
#pragma pack (push,1)
typedef struct
{
int a;
}ABC;
#pragma pack (pop)
//---------------------------------------------------------------------------
extern "C" void __declspec(dllexport) __cdecl writeParameter(ABC *abc)
{
ofstream outfile("result.txt");
outfile<< "A=" <<endl;
outfile << abc->a <<endl;
outfile.close();
}
:正常に動作しますwriteParameter機能は、それがファイルに正しいデータを書き込みますが、その後、私は例外を持って
C++コード「型 『System.StackOverflowException』の未処理の例外はPresentationFramework.dllに発生しました」 c#:
[StructLayoutAttribute(LayoutKind.Sequential)]
public class ABC
{
public int a;
}
[DllImport("D:\\monitorVC.dll", EntryPoint = "_writeParameter", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern void WriteParameter(
[In,MarshalAs(UnmanagedType.LPStruct)]
ABC abc
);
private void Grid_Loaded(object sender, RoutedEventArgs e)
{
var abc = new ABC() {a = 123};
WriteParameter(abc);
}
これは、ABCが構造体のように宣言されていると仮定しています。クラスをそのままにしておけば、* ref *キーワードを削除してください。 –
同じです。関数が機能します(つまり、正しい構造体を取得してファイルに書き込む)が、StackOverflowExceptionが発生します。 – user521304
指定されたコードでは意味がありません。しかし、デバッガ、デバッグ+ Windows +レジスタを使用してください。コールの前後にESPの値を見てください。また、アンマネージコードのデバッグを有効にし、Cコードにブレークポイントを設定してください。 –