Я объявил импорт 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. Никаких проблем нет. Это проблема с выделением памяти ??