質問

これは解決する必要がある単純な問題ですが、すべての試みで同じエラーが返されるため、髪が白髪になっているように感じます。

「保護されたメモリの読み取りまたは書き込みを試みました。これは多くの場合、他のメモリが破損していることを示しています。」

DLL を呼び出す C++ で書かれたサンプル アプリがあります。関連するコードは次のとおりです。

    //function I need to call
bool convertHKID_Name(char *code,RECO_DATA *o_data);    //hkid 

//struct definition
struct RECO_DATA{
    wchar_t FirstName[200];
    wchar_t Surname[200];
};

//how it is used in C++ code
CString code;
RECO_DATA data;
GetDlgItemText(IDC_CODE,code);
char _code[200];
WideCharToMultiByte(CP_UTF8, 0, code, -1, (char *)_code, 200, NULL, NULL);
ocr->convertHKID_Name(_code,&data)

ここで C++ コードをデバッグすると、Unicode データがデータ構造体に書き込まれるという適切な動作が行われます。

これはC#で同じことをしようとする私の試みです

    //my C# wrapper class
public class cnOCRsdk
{
    [StructLayout(LayoutKind.Sequential, Size=400, CharSet=CharSet.Unicode), Serializable]
    public struct RECO_DATA
    {
        [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 200)]
        public string FirstName;
        [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 200)]
        public string Surname;
    };

    [DllImport(@"cnOCRsdk.dll", CharSet=CharSet.Auto, EntryPoint = "?convertHKID_Name@CcnOCRsdk@@QAE_NPADPAURECO_DATA@@@Z")]
    public static extern bool convertHKID_Name(ref string num, ref RECO_DATA o_data);

    [DllImport("Kernel32.dll")]
    public static extern int WideCharToMultiByte(uint CodePage, uint dwFlags,
        [In, MarshalAs(UnmanagedType.LPWStr)]string lpWideCharStr,
        int cchWideChar,
        [Out, MarshalAs(UnmanagedType.LPStr)]StringBuilder lpMultiByteStr,
        int cbMultiByte,
        IntPtr lpDefaultChar, // Defined as IntPtr because in most cases is better to pass
        IntPtr lpUsedDefaultChar // NULL
        );
}

//my attempt to call the function from the dll
cnOCRsdk.RECO_DATA recoData = new cnOCRsdk.RECO_DATA();
string num = "262125355174";
StringBuilder sb = new StringBuilder(200, 200);
cnOCRsdk.WideCharToMultiByte(65001, 0, num, -1, sb, 200, IntPtr.Zero, IntPtr.Zero);
string sbTostring = sb.ToString();
//the next line generates the 'Attempted to read or write protected memory' error
bool res = cnOCRsdk.convertHKID_Name(ref sbTostring, out recoData);

私の推測では、convertHKID_Name 関数によって書き込まれるのはこの構造体であるため、RECO_DATA 構造体が適切にマーシャリングされていないと考えられます。しかし、どうやって直せばいいのでしょうか?

役に立ちましたか?

解決

あなたがそうすればうまくいくはずだと私は信じています

  1. 宣言を変更しますconvertHKID_NameCharSet.Ansi
  2. 文字列パラメーターから「ref」を削除します
  3. を渡す string num直接に convertHKID_Name 呼び出す代わりに WideCharToMultiByte

他のヒント

私は自分の管理対象外のdllのためのC ++でマネージラッパーを書いたが、少し再び捕まってしまっています。

ここに続け

に書き込まれたDLLにC#のデータ型パラメータを渡しますC ++ですか

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top