2

我需要使用 C 创建 dll。但我看到了一些问题。好的,首先:我需要 dll 库中的函数来计算线的角度 - tgA = dy/dx。角度 = arctg(dy/dx)。我在文件framework.c中定义了这个:

JSBool computeAngle(JSContext *cx, 
                    JSObject *obj, 
                    unsigned int argc, 
                    jsval *argv, 
                    jsval *rval ) {
double dx, dy, angle;
if (argc != 2) {
    return JS_FALSE;
}
if (JS_ValueToDouble(cx, argv[0], &dy) == JS_FALSE ||
        JS_ValueToDouble(cx, argv[1], &dx) == JS_FALSE) {
    return JS_FALSE;
}
if( dx == 0 ) {
    if( dy < 0 ) angle = -90;
    else if( dy > 0 ) angle = 90;
    else angle = 0;
}else angle = atan(dy/dx)*180/M_PI;
return JS_DoubleToValue(cx, angle, rval);
}

但是这个方法行不通!我认为有问题,并从 Adob​​e 网站下载了 Sample.zip。我在我的函数上更改了函数 computeSum,但它仍然不起作用。我认为 JS_ValueToDouble() 和 JS_DoubleToValue 方法有问题。你怎么想?

4

1 回答 1

0

该方法的哪一部分不起作用?从另一组代码调用 dll 中的方法(例如,您已经编译了 DLL 并创建了一个测试程序,但它引发了链接器错误),或者您无法编译您的 dll?如果是第一个,您的方法需要定义如下宏:

#ifdef EXPORT
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT __declspec(dllimport)
#endif

在您的标头中(或者如果该函数未在标头中声明,则在 C 文件中),您需要

DLL_EXPORT JSBool computeAngle(JSContext *cx, 
                               JSObject *obj, 
                               unsigned int argc, 
                               jsval *argv, 
                               jsval *rval )

如果在尝试编译 dll 时出现错误,则很有可能您没有正确链接到 dll - 您需要设置项目链接器属性(如果使用 MSVS)或使用 -l 选项(如果使用 MinGW)。

于 2011-04-09T06:17:16.277 回答