ホームページ  >  記事  >  コンピューターのチュートリアル  >  ネストされた DLL でコールバック関数を呼び出すにはどうすればよいですか?

ネストされた DLL でコールバック関数を呼び出すにはどうすればよいですか?

WBOY
WBOY転載
2024-01-20 08:27:16969ブラウズ

ネストされた DLL でコールバック関数を呼び出すにはどうすればよいですか?

ネストされた DLL でコールバック関数を呼び出す方法

HMODULE hModelHand = LoadLibrary(__T("MyDLL.DLL"));

SetLog pLogShowFun = (SetLog)GetProcAddress(hModelHand, MYTESTFUN);

{ if (NULL == pLogShowFun)

AfxMessageBox(__T("mydll.dll アドレスを取得できません!"));

}

pLogShowFun((writeLog *)(Mylog::writelog));1234567891011

DLLでの操作

#MyDLL_API extern "C" __declspec( dllexport )

を定義します。

typedef void(*writeLog)(const char *plogFile, int p_nType, const char * logText);

writeLog g_RunLog = NULL;

MyDLL_API void mytestfun(void *pfun)

{ if (pfun)

{

g_RunLog = (writeLog)pfun;

}

}

C コールバック関数の実装方法を説明する

C# コールバック関数とは何ですか? C# コールバック関数は、Windows システム DLL またはその他の DLL によって呼び出されるアプリケーションによって提供される関数であり、通常、メッセージのインターセプト、システム情報の取得、または非同期イベントの処理に使用されます。アプリケーションは DLL にコールバック関数のアドレス ポインターを伝え、DLL は適切なタイミングで関数を呼び出します。コールバック関数は、事前に指定されたパラメータの形式と配信方法に準拠している必要があります。準拠していないと、DLL がコールバック関数を呼び出すとすぐにプログラムまたはシステムがクラッシュします。通常、コールバック関数は Windows API の標準呼び出しメソッドである __stdcall を使用しますが、DLL コンパイラ自身で呼び出しメソッドを定義することももちろん可能ですが、クライアントプログラムも同様の規定に従う必要があります。 __stdcall モードでは、関数のパラメータは右から左の順序でスタックにプッシュされます。ポインタまたは参照として明示的に指定されない限り、パラメータは値によって渡されます。スタックからパラメータをポップするのはユーザーの責任です。関数が戻る前に。 C# コールバック関数を理解しましょう。プログラムが関数 (通常 API と呼ばれる) を呼び出すことは、プログラムが関数を呼び出すことと等価であり、その関係は次のように表されます。

プログラム--------------------→dll

プログラムが関数を呼び出すとき、プログラムはそれ自身の関数のアドレスをパラメータとしてプログラムによって呼び出される関数に渡します (そのとき、その独自の関数はコールバック関数と呼ばれます)。コールバック関数を必要とする DLL 関数は、多くの場合、繰り返し実行する必要があり、演算の機能と関係は次のように表されます: call (call)

callback (コールバック) 呼び出した関数が戻り値をコールバック関数に渡すと、コールバック関数を使用して特定の操作を処理または完了できます。独自のコールバック関数を定義する方法については、使用する特定の API 関数によって異なります。多くの異なる種類のコールバック関数にはさまざまなパラメータがあります。これらのパラメータの説明は、一般にヘルプに説明されています (パラメータや戻り値など)。コールバック関数. 実際、簡単に言えば、コールバック関数は、作成した関数が特定の条件を満たした後に DLL によって呼び出されます。コールバック関数は、設定した条件が満たされたときにシステムによって自動的に呼び出される、割り込み処理関数のようなものです。以下はサンプル コードです: WorkClass.cs: usingSystem; namespaceCallBackSample ...{ publicdelegatestringShowMessage(stringmessage); innerclassWorkClass ...{ publicvoidDoWork(stringmessage) ...{ ShowMessageshowMessage=newShowMessage(showCoolMessage); showMessage =showTerribleMessage; stringresult=" "; foreach(ShowMessageshinshowMessage.GetInvocationList()) ...{ result =sh(message); } Console.Write(result); Console.Read(); } privatestringshowCoolMessage(stringmessage) ...{ strings=message "クール! "; 戻り値; } privatestringshowTerribleMessage(stringmessage) ...{ strings=メッセージ "ひどい!"; 戻り値; } } } Program.cs: namespaceCallBackSample ...{ classProgram ...{ staticvoidMain(string[]args) ... { WorkClassworkClass =newWorkClass(); workClass.DoWork("バスケットボール"); } } }

以上がネストされた DLL でコールバック関数を呼び出すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はdocexcel.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。