mingwを使用してDLLを正しくコンパイルし、エクスポート/インポートを実行できます。私が探しているのは、MS VC製品と同じようにdll onload関数を適切に定義することです。 Googleは何も出せなかった。誰でもチュートリアルへのアイデアやリンクがありますか?mingw32のdll onload関数を指定するにはどうすればよいですか?
答えて
さて、いろいろなことをしてから...うまくいきました。ここに問題がある人は誰でも私の問題は、動的に読み込むのではなく、コンパイルすることに関連していませんでした。これは私にこの点を教えてくれたチュートリアル/質問/ハウツーのマッシュアップでした。
dll.c
#include <stdio.h>
#include <windows.h>
#include "dll.h"
//extern "C" BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD Reason, LPVOID LPV) {
//This one was only necessary if you were using a C++ compiler
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
// Code to run when the DLL is loaded
printf ("Load working...\n");
break;
case DLL_PROCESS_DETACH:
// Code to run when the DLL is freed
printf ("Unload working...\n");
break;
case DLL_THREAD_ATTACH:
// Code to run when a thread is created during the DLL's lifetime
printf ("ThreadLoad working...\n");
break;
case DLL_THREAD_DETACH:
// Code to run when a thread ends normally.
printf ("ThreadUnload working...\n");
break;
}
return TRUE;
}
EXPORT void hello(void) {
printf ("Hello\n");
}
dll.h
#ifndef DLL_H_
#define DLL_H_
#ifdef BUILD_DLL
/* DLL export */
#define EXPORT __declspec(dllexport)
#else
/* EXE import */
#define EXPORT __declspec(dllimport)
#endif
EXPORT void hello(void);
#endif /* DLL_H_ */
のhello.c
#include <windows.h>
#include <stdio.h>
int main() {
/*Typedef the hello function*/
typedef void (*pfunc)();
/*Windows handle*/
HANDLE hdll;
/*A pointer to a function*/
pfunc hello;
/*LoadLibrary*/
hdll = LoadLibrary("message.dll");
/*GetProcAddress*/
hello = (pfunc)GetProcAddress(hdll, "hello");
/*Call the function*/
hello();
return 0;
}
gcc -c -DBUILD_DLL dll.c
gcc -shared -o message.dll dll.o -Wl,--out-implib,libmessage.a
gcc -c hello.c
gcc -o hello.exe hello.o message.dll
な生産でコンパイル予想される出力は
Load working...
Hello
Unload working...
偉大なあなたはそれが働いた:) –
です。mingwはGCCと関連するツールのWindowsポートにすぎないので、GCC constructor and destructor attributesを使用できます。これらは共有ライブラリと静的ライブラリの両方で動作し、mainが実行される前後のコードを実行します。さらに、ライブラリごとに複数のコンストラクタ関数とデストラクタ関数を指定することもできます。
static void __attribute__((constructor))
your_lib_init(void)
{
fprintf(stderr, "library init\n");
}
static void __attribute__((destructor))
your_lib_destroy(void)
{
fprintf(stderr, "library destroy\n");
}
ありがとう。これは、nix側で同様のことをする必要がある場合、クロスプラットフォームのものに役立ちます。 – RobotHumans
以前のdll.c、dll.h、hello.c、コンパイルメソッドを使用していますが、これらの関数を追加するだけで動作しません。 DLLはmain()を呼び出さないので、私は推測する –
より具体的にしてください '動作しない'。 DLLはメインを呼び出すことはありません。ダイナミックリンカはライブラリコンストラクタをロード&実行し、main()、デストラクタをロードして実行します。 –
- 1. オプションでPythonで関数の引数を指定するにはどうすればよいですか?
- 2. Clojureで高次関数の引数を指定するにはどうすればよいですか?
- 3. コマンドライン引数を指定するにはどうすればよいですか?
- 4. 関数引数のオブジェクト位置を指定するにはどうすればよいですか?
- 5. vim 8のpython dllの場所を指定するにはどうすればよいですか?
- 6. NServiceBus.Host.exeでエンドポイントクラスを指定するにはどうすればよいですか?
- 7. タイプヒントで関数のタイプを指定するにはどうすればよいですか?
- 8. MSYS2とmingw32-makeで複数のコアを使用するにはどうすればよいですか?
- 9. メイン関数でサブ関数の引数を指定しないようにするにはどうすればよいですか?
- 10. .onload関数の後にコードを実行するにはどうすればいいですか?
- 11. laravelフレームワークで角度jでonload関数を使用するにはどうすればいいですか?
- 12. Clojureで負の指数でパワー関数を作成するにはどうすればよいですか?
- 13. ブラウザアクションのホットキーを指定するにはどうすればよいですか?
- 14. バワーオーバーライドでバージョンを指定するにはどうすればよいですか?
- 15. itunesconnectでデバイスを指定するにはどうすればよいですか?
- 16. Phoenix.ConnTestでフォーマットを指定するにはどうすればよいですか?
- 17. VBAで列を指定するにはどうすればよいですか?
- 18. コントロールにスマートタグを指定するにはどうすればよいですか?
- 19. Webpackに含める特定のcss/jを指定するにはどうすればよいですか?
- 20. 変数/関数定義をParallel(ParallelMapなど)で設定するにはどうすればよいですか?
- 21. Entity Frameworkでは、関連付けの条件を指定するにはどうすればよいですか?
- 22. クランフォーマットファイルを指定するにはどうすればよいですか?
- 23. 最大ダウンロードサイズを指定するにはどうすればよいですか?
- 24. ジェネリッククラスのジェネリックコレクションタイプも指定するにはどうすればよいですか?
- 25. PHPフォーマット関数のChinessとして曜日を指定するにはどうすればいいですか?
- 26. BigDecimalを指数関数形式に変換するにはどうすればよいですか?
- 27. これらの変数をperlで正しく指定するにはどうすればよいですか?
- 28. msing2の下でmingw32-makeのインクルードとライブラリの場所を指定するにはどうすればよいですか?
- 29. 大きな指数関数を計算するにはどうすればよいですか?
- 30. 適合した指数関数のxを見つけるにはどうすればよいですか?
"dll onload"とは、DllMainを指していますか?あなたはそれが正しい署名を持っていると確信していますか?これは、次のようにする必要があります。extern "C" DLL_EXPORT BOOL APIENTRY DllMain(HINSTANCE hinstDLL、DWORD Reason、LPVOID LPV)。質問にコードスニペットを追加してみてください。 –
はい、それはまさに私が意味するものです、ありがとう。 – RobotHumans
@ aking1012私はそのDllMain署名を質問に追加すべきだとは言っていませんが、あなた自身のDllMain署名を追加する必要はありません。 –