Множественные вызовы функций из C # в неуправляемый код C ++ вызывают AccessViolationException

Я объявил импорт DLL в моей программе на C #, который выглядит следующим образом:

[DllImport("C:\\c_keycode.dll", EntryPoint = "generateKeyCode", 
           CallingConvention = CallingConvention.Cdecl)]
static extern IntPtr generateKeyCode(char[] serial, char[] option, char c_type);

Он ссылается на функцию generateKeyCode () внутри моей DLL.

Вот код, вызывающий ошибку (используемые точки останова):

const char* generateKeyCode(char serial[], 
                 char option[], 
                 char c_type)
{
returnBufferString = "";
SHA1_CTX context;
int optionLength = 0;
#ifdef WIN32
unsigned char buffer[16384] = {0};
#else
unsigned char buffer[256] = {0}; 

#endif
//char output[80];
char keycode[OPTION_KEY_LENGTH+1]        = "";
int digest_array_size = 10; //default value for digest array size
unsigned char digest[20] = {0};
char optx[24] = {0};
char c_type_upper;
// Combine serial # and Option or Version number

char str1[30] = {0};
int i;
int size = 0;
int pos = 0;


...
...
}

По сути, я импортировал эту DLL, чтобы я мог передать параметры функции, и она могла выполнить свой алгоритм и просто вернуть мне результат. Я использовал эту функцию маршалера ...

public static string genKeyCode_marshal(string serial, string option, char type)
{
    return Marshal.PtrToStringAnsi(generateKeyCode(serial.ToCharArray(), 
           option.ToCharArray(), type));
}

... чтобы я мог правильно выполнить вызов. Внутри моего файла заголовка C ++ я определил строку, как указано, это полезно в ответе на этот вопрос (это переменная returnBufferString , присутствующая в верхней части C / C ++ функция).

Я вызываю эту функцию несколько раз, поскольку использую элемент управления NumericUpDown для перехода от 1,0 до 9,9 с шагом 0,1 (каждое увеличение или уменьшение сопровождает другой вызов функции), а затем снова вниз. Однако каждый раз, когда я пытаюсь это сделать, программа заедает после, казалось бы, установленного количества вызовов функций (останавливается на 1,9 на обратном пути вниз, если я просто иду прямо вверх и вниз, или раньше, если я немного чередую вверх и вниз) .

Обратите внимание, что это работает и дает мне желаемое значение, в нем нет никаких расхождений.

Я изменил размер буфера на меньшее число (5012), и когда я попытался запустить программу, при первом вызове функции возникло исключение AccessViolationException. Однако удвоение размера буфера в два раза (32768) оригинала не имело никакого эффекта по сравнению с оригиналом - при прямом увеличении до 9,9 с 1,0 и обратно, он останавливается на 1,9 и вызывает исключение.

РЕДАКТИРОВАТЬ: По умолчанию это ANSI, поэтому это ANSI. Никаких проблем нет. Это проблема с выделением памяти ??

6
задан Sean Glover 5 January 2012 в 00:18
поделиться