Kaller C ++ dll funksjon fra C #: Av structs, strenger og wchar_t arrays

stemmer
1

Her er en enkel problem jeg må løse, men det gjør meg til å føle meg håret blir grå som alle mine forsøk på å returnere meg den samme feilen:

Forsøkte å lese eller skrive beskyttet minne. Dette er ofte en indikasjon på at andre minnet er skadet.

Jeg har en prøve app skrevet i C ++ som gjør en samtale til dll. Her er relevant kode:

    //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)

Nå når jeg feilsøke C ++ kode, gjør det riktig ting - skriver noen Unicode-data til data struct.

Her er mitt forsøk på å gjøre det samme i 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);

Min gjetning er at jeg ikke marshaling den RECO_DATA struktur riktig, fordi det er denne struct som blir skrevet til av convertHKID_Name funksjon. Men hvordan skal jeg fikse det?

Publisert på 25/03/2009 klokken 02:55
kilden bruker
På andre språk...                            


2 svar

stemmer
2

Jeg tror det skal fungere hvis du

  1. Endre erklæring om convertHKID_NameåCharSet.Ansi
  2. Fjerne "ref" fra strengen parameter
  3. Passere string num direkte til convertHKID_Namestedet for å ringeWideCharToMultiByte
Svarte 25/03/2009 kl. 03:19
kilden bruker

stemmer
0

Jeg skrev en administrert wrapper i C ++ for min uovervåkede dll, men ble sittende fast en bit igjen.

Fortsatt her

Passerer C # datatypeparametere til DLL skrevet i C ++?

Svarte 26/03/2009 kl. 01:07
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more