为什么我的Game Maker DLL会出现访问冲突?

时间:2014-01-23 14:08:41

标签: c++ dll access-violation dllexport game-maker

我找到了一个关于制作你的第一个C ++ DLL的tutorial,我想通过创建一个计算某个频率的八度数的函数来尝试。我首先尝试了示例函数,将两个值相乘,然后才有效。然后我将我的计算函数(我在标准c ++项目中首次测试)放在DLL代码中。现在当我想在Game Maker中调用该函数时,它会给我this popup,当我单击OK按钮时程序挂起。 有没有人知道什么可能导致这种访问违规?

编译器信息:我将NetBeans IDE 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.]

1 个答案:

答案 0 :(得分:1)

关于这些导出的功能:

  

插件功能必须具有特定格式。它们可以有0到16个参数,每个参数可以是实数(C 中的两倍)或以空值终止的字符串。 (对于超过4个参数,目前仅支持实参数。)它们必须返回实数或以空值结尾的字符串。

你的返回一个整数,而不是一个整数。 Game Maker将尝试将该整数解释为double,这并不顺利。