mingwを使用してDLLを適切にコンパイルし、エクスポート/インポートを行うことができます。私が探しているのは、MSVC製品の場合と同じようにdllonload関数を適切に定義することです。グーグルは何も出さなかった。誰かアイデアやチュートリアルへのリンクがありますか?
6020 次
2 に答える
13
さて、少しいじった後...それは機能しています。ここで問題を抱えている他の人にとってはそうです。私の問題は、動的にロードするのではなく、コンパイルすることとは関係ありませんでした。この点に到達したのは、いくつかのチュートリアル/質問/ハウツーのマッシュアップでした。
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_ */
こんにちは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...
于 2011-06-22T00:14:08.230 に答える
1
mingwはGCCおよび関連ツールの単なるWindowsポートであるため、GCCコンストラクタおよびデストラクタ属性を使用できます。これらは共有ライブラリと静的ライブラリの両方で機能し、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");
}
于 2011-06-22T19:45:28.423 に答える