Имам C++ DLL, който експортира метод като този:
extern "C" __declspec (dllexport) void ConvE(int type, const char* path, int b1, int b2, int b3, int b4, int b5)
{
FFileList file_list;
char temp_path[1024];
if(type == 1)
{
sprintf(temp_path,"%s*",path);
GetFindFileListWin(temp_path,".mrs",file_list);
file_list.RecoveryZipE(b1, b2, b3, b4, b5);
file_list.ConvertNameMRes2Zip();
}
else if(type == 2)
{
sprintf(temp_path,"%s*",path);
GetFindFileListWin(temp_path,".zip",file_list);
file_list.ConvertZipE(b5, b4, b3, b2, b1);
file_list.ConvertNameZip2MRes();
}
}
И го извиквам в моето C# приложение по този начин:
[DllImport("Mrs.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern void ConvE(int type, string path, int b1, int b2, int b3, int b4, int b5);
Но всеки път, когато го стартирам, ми извежда грешката „Опит за четене или запис на защитена памет. Това често е индикация, че друга памет е повредена“
Доколкото прочетох, нещо не е наред с начина, по който импортирам функцията в C#, но наистина не знам как да го реша.
Редактиране: по подразбиране имаше Conv(), който е същият като моя ConvE, но без 5-те цели числа, и този работи добре. Направих ConvE да използва file_list.RecoveryZipE(), който преди това при отстраняване на грешки ме подрежда върху метод вътре в този, наречен RecvoeryCharE (добавих го към кода си, можете да го разгледате) и също така този беше базиран на RecoveryChar(), който работи на Conv().
Char за възстановяване:
void RecoveryChar(char* pData,int _size)
{
if(!pData) return;
BYTE b,bh,d;
for(int i=0;i<_size;i++) {
b = *pData;
bh = b&0x07;
d = (bh<<5)|(b>>3);
*pData = d ^ 0xff;
pData++;
}
}
RecvoeryCharE:
void RecoveryCharE(char* pData, int _size, int b1, int b2, int b3, int b4, int b5)
{
if(!pData) return;
BYTE b;
for(int i=0;i<_size;i++) {
b = *pData;
b = (((((b >> b1) | (b << 5)) ^ b2) + b3) ^ b4) - b5;
*pData = b;
pData++;
}
}
Последното изключение, което получих при отстраняване на грешки в приложението C#:
Редактиране: След повторно отстраняване на грешки, той остава тук
RecoveryCharE( _fileheaderReader , _fileheaderReaderSize, b1, b2, b3, b4, b5 );
По някаква причина стойността b1 винаги приема 0. и изглежда, че поради тази причина получавам грешката в защитената памет.
Всичко, което направих, беше да копирам всички методи, където присъстваха recoveryChar() и convertChar() и да предам стойностите като параметри.
ConvE
получаваconst char *
, аRecoveryCharE
получаваchar *
и се опитва да го промени. Предавате ли низа, получен отConvE
наRecoveryCharE
? Ако това е така, вероятно C# VM не е доволна от промяната на низ в нея. - person Leonardo   schedule 10.06.2014