Я нашел руководство о создании вашей первой C ++ DLL, которую я хотел попробовать, создав функцию, которая вычисляет октавное число определенной частоты. Сначала я попробовал пример функции, умножив два значения, и это сработало. Затем я поместил свою функцию вычисления, которую я сначала протестировал в стандартном проекте c ++, в код DLL. Теперь, когда я хочу вызвать функцию в Game Maker, она дает мне это всплывающее окно и когда я нажимаю кнопку ОК, программа зависает.
У кого-нибудь есть идеи, что может вызвать это нарушение прав доступа?
Информация о компиляторе: я использую IDE NetBeans 7.3 в сочетании с Cygwin 4 (gcc).
Скомпилировано и протестировано на Windows 7.
Код DLL:
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <string>
#include <cmath>
#include <cstdio>
#include <windows.h>
#define GMEXPORT extern "C" __declspec (dllexport)
double A440 = 440;
GMEXPORT double __cdecl SampleFunction(double a, double b) {
return a * b;
}
GMEXPORT int __cdecl freqGetOctave(double f) {
double a = 12*log2(f/(A440/16))+.505;
int c = (int)(a+9)/12;
return c;
}
Код Game Maker:
//script: dll_init
globalvar _exmpl,_freq;
var dll_name;
dll_name = "c:\Users\<me>\Documents\NetBeansProjects\GMDLLtest\dist\Debug\Cygwin_4.x-Windows\libGMDLLtest.dll";
_exmpl = external_define(dll_name, "SampleFunction", dll_cdecl, ty_real, 2, ty_real, ty_real);
_freq = external_define(dll_name, "freqGetOctave", dll_cdecl, ty_real, 1, ty_real);
//script: example
return external_call(_exmpl,argument0,argument1);
//script: freq_octave
return external_call(_freq,argument0);
//Watch Excpressions in Debug Screen:
example(3,3) 9
freq_octave(440) [error popped up:]
// [Access violation at address 00405B33 in module 'DLLtest.exe'.
// Read of access 00000004.]
Относительно этих экспортируемых функций:
Подключаемые функции должны иметь определенный формат. Они могут иметь от 0 до 16 аргументов, каждый из которых может быть действительное число (двойное в C) или строка с нулевым символом в конце. (Для более чем 4 аргументов в настоящий момент поддерживаются только реальные аргументы.) Они должны возвращать либо действительную, либо строку с нулевым символом в конце.
Ваш возвращает целое число, а не двойное. Game Maker будет пытаться интерпретировать это число как двойное, что не очень хорошо.
Других решений пока нет …