2

C を使用して dll を作成する必要がありますが、いくつか問題がありました。OK、まず: 線の角度を計算するための 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);
}

しかし、この方法はうまくいきません!何かおかしいと思い、Adobeのサイトから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 を使用している場合はプロジェクト リンカー プロパティを設定するか、MinGW を使用している場合は -l オプションを使用する必要があります。

于 2011-04-09T06:17:16.277 に答える