1

MSVC 6(レトロ!)を使用してWindowsで共有ライブラリ(DLL)を構築しようとしていますが、解決する必要のある固有のリンクの問題があります。共有ライブラリは、読み込み中のアプリケーションによって制御されるグローバルな状態にアクセスする必要があります。

大まかに言って、私が持っているのはこれです:

application.c:

static int g_private_value;

int use_private_value() {
    /* do something with g_private_value */
}

int main (...) {
    return shared_library_method ();
}

shared_library.c:

__declspec(dllexport) int __stdcall shared_library_method() {
    use_private_value();
}

更新-その部分を忘れました__declspec(dllexport) int __stdcallが、実際のコードにあります)

shared_library_methodエクスポートおよびインポートするようにshared_library.dllを設定するにはどうすればよいuse_private_valueですか?

A)私は一般的にUNIXプログラマーであり、B)VisualStudioなしでこれを行っていることを覚えておいてください。自動ビルドインフラストラクチャは、makefileを使用してMSVCを駆動します。質問に答えやすくするために省略している場合は、コメントしてください。できるだけ早く更新します。

4

3 に答える 3

2

これは、実際に作業を行うのはかなり難しいでしょう。Unix/Linux では、共有オブジェクトとアプリケーションに相互にシンボルをインポートさせることができますが、Windows では、それをロードするアプリケーションから DLL にシンボルをインポートさせることはできません。Windows PE 実行可能形式は、そのイディオムをサポートしていません。

Cygwin プロジェクトには、この問題に対処するための何らかの回避策があることは知っていますが、それが些細なことだとは思いません。多くの PE 関連のハッキングを行いたくない場合は、おそらくそこに行きたくないでしょう。

より簡単な解決策は、DLL からエクスポートされたある種の初期化メソッドを持つことです。

typedef int (*func_ptr)();
void init_library(func_ptr func);

アプリケーションは起動時にこれを呼び出し、共有する関数のアドレスを渡す必要があります。正確にはエレガントではありませんが、問題なく動作するはずです。

于 2008-10-29T17:22:44.883 に答える
1

答えの半分から始めましょう。

shared_library.c内:

__declspec(dllexport) int __stdcall shared_library_method(void)
{


}

DLLからの関数のエクスポートに関するMSDNの記事。

于 2008-10-29T16:59:46.757 に答える
1

後半では、application.c から関数をエクスポートする必要があります。これは、リンカーで次のように行うことができます。

/export:use_private_value@0

これにより、DLL でビルドする lib ファイルが取得されます。

lib ファイルをリンクするオプションは、GetProcAddress() を使用することです。

DavidK が指摘したように、いくつかの関数しかない場合は、init 関数で関数ポインターを渡す方がおそらく簡単です。しかし、あなたが求めていることをすることは可能です。

于 2008-10-29T17:30:32.043 に答える