0

管理されていない MFC dll 用の C++ .net ラッパーを使用しています。このラッパーは、vb.net dll によって使用され、私の c# コードに呼び出されます。実行時に、ラッパーが保護されたメモリの読み取りまたは書き込みを試みたという例外をスローすることがあります。

System.AccessViolationException: Attempted to read or write protected memory. 
This is often an indication that other memory is corrupt

「While」ループでランダムに発生するようです。最初に投げる時もあれば、途中で投げる時もあれば、何も投げない時もあります。

仕組み: 私のプログラムには MFC dll が必要です。私のプログラムには wrapper.dll(c++) と myVbDll.dll(vb.net) が参照されています。また、有効な COM コンポーネントではないため、MFC dll をコンテンツとして追加しました。これがどのように機能するかです:

myProgramm.exe->myVbDll.dll->wrapper.dll->myMFC.dll->myMFCfunction

INFO :field = "WHATSOEVER"; MyWrappedFunction を呼び出す直前に設定すると、エラーがスローされることはありません!!

更新:いくつかの変更後、問題は引き続き発生します。今回は、Unicode 文字列を Ansi に変換する方法を見ていきます。何か見つけられるかもしれません... 原因は、上記のように文字列にテキストを記述すると機能しますが、ToString 関数を使用すると機能しません。

なぜこれが起こるのか、誰かが教えてくれますか?

c# での私のプログラムの一部 (フィールドを取得するために TextFieldParser を使用して .csv ファイルから 5000 行を読み取る):

string[] fields;
string field ;
string temp = "";

TextFieldParser parser = new TextFieldParser(textbox_csv.Text, System.Text.Encoding.UTF8);
parser.TextFieldType = FieldType.Delimited;
parser.SetDelimiters(";");

while (!parser.EndOfData)
{
    fields = parser.ReadFields();
    field = fields[0];
    temp = field.ToUpper();
    field = myVbDll.MyWrappedFunction(ref temp, false);
}

私のC#プログラムによって呼び出されるVB.net Dllの一部:

Public Class myVbDll

Public Declare Auto Function MyWrappedFunction Lib "myWrapper.dll" (ByVal name As String, ByVal opt As Boolean) As String

End Class

VB.net Dllによって呼び出されるMFCラッパーの一部(エラーは確かにMFC dllにはありません):

typedef void (*MYFUNCTION)(CString&, CString&, BYTE);
MYFUNCTION Myfunction;

LPWSTR _stdcall MyWrappedFunction(LPWSTR ValInput, BYTE opt)
{
    HINSTANCE gLibtestDLL=NULL;
    CString S_ValInput(ValInput);
    CString S_resultat;

    gLibtestDLL = AfxLoadLibrary(TEXT(".\\test.dll"));
    if(gLibtestDLL == NULL)
    {
        MessageBox(NULL, TEXT("unable to load test.DLL"), TEXT("Error"),MB_OK | MB_ICONINFORMATION);
        return NULL;
    }

    Myfunction = (MYFUNCTION)GetProcAddress(gLibtestDLL, "Myfunction");
    if (Myfunction == NULL)
    {
        MessageBox(NULL, TEXT("Can't find Myfunction."), TEXT("Error"),MB_OK | MB_ICONINFORMATION);

        return NULL;
    }
    //******************************************************************

    S_resultat.LockBuffer();
    S_resultat.Format("%64c", ' ');
    Myfunction(S_ValInput , S_resultat , opt);
    S_resultat.ReleaseBuffer();

    S_resultat.LockBuffer();
    S_resultat.TrimRight();
    S_resultat.ReleaseBuffer();

    // CString To UNICODE
    USES_CONVERSION;
    S_resultat.LockBuffer();
    LPWSTR C_tmp= A2OLE(S_resultat.GetBuffer(S_resultat.GetLength()));
    S_resultat.ReleaseBuffer();

    AfxFreeLibrary(gLibtestDLL);

    LPWSTR C_resultat=C_tmp;
    //******************************************************************

    return C_resultat;

}
4

2 に答える 2