문제

해결해야 할 간단한 문제는 다음과 같습니다. 그러나 모든 시도가 저에게 같은 오류를 돌려 주면서 머리카락이 회색으로 변하는 느낌이 듭니다.

"보호 된 기억을 읽거나 쓰려고 시도했습니다. 이것은 종종 다른 기억이 손상되었음을 나타냅니다."

C ++로 작성된 샘플 앱이있어 DLL을 호출합니다. 관련 코드는 다음과 같습니다.

    //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 ++ 코드를 디버깅 할 때 적절한 작업을 수행합니다. 일부 유니 코드 데이터를 데이터 구조물에 씁니다.

다음은 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_Name 에게 CharSet.Ansi
  2. 문자열 매개 변수에서 "Ref"를 제거하십시오
  3. 통과하십시오 string num직접 convertHKID_Name 전화하는 대신 WideCharToMultiByte

다른 팁

나는 관리되지 않은 DLL을 위해 C ++로 관리되는 래퍼를 썼지 만 다시 조금 붙어있었습니다.

여기서 계속되었습니다

C# 데이터 유형 매개 변수를 C ++로 작성한 DLL에 전달합니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top