У меня есть 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);
Но каждый раз, когда я запускаю его, он выдает ошибку "Попытка чтения или записи в защищенную память. Это часто указывает на то, что другая память повреждена"
Насколько я читал, что-то не так с тем, как я импортирую функцию в С#, но я действительно не знаю, как это решить.
Изменить: по умолчанию был Conv(), такой же, как мой ConvE, но без 5 целых чисел, и он отлично работает. Я сделал ConvE для использования file_list.RecoveryZipE(), который ранее при отладке накладывал меня на метод внутри этого, который называется RecvoeryCharE (я добавил его в свой код, вы можете взглянуть на него), а также тот, который был основан на RecoveryChar(), который работает с Conv().
RecoveryChar:
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# недовольна изменением строки внутри нее. - person Leonardo   schedule 10.06.2014