1 生成DLL文件
1)打開VisualStudio,選擇創(chuàng)建新項(xiàng)目。

2)選擇c++的動(dòng)態(tài)鏈接庫(kù)

3)編寫項(xiàng)目名稱,對(duì)應(yīng)生成dll的名稱,此處命名為MyCallbacks

4)右側(cè)資源管理器,在頭文件位置,添加新建項(xiàng)。


5)編寫相關(guān)頭文件

#pragma once
#ifdef MY_SIMPLE_MATH_EXPORTS
#define MY_SIMPLE_MATH_API __declspec(dllexport)
#else
#define MY_SIMPLE_MATH_API __declspec(dllimport)
#endif
// 定義回調(diào)函數(shù)的簽名
typedef void (*CallbackFunction)(int a, int b, int& sum);
// 用于注冊(cè)回調(diào)函數(shù)的函數(shù)聲明
extern "C" MY_SIMPLE_MATH_API void RegisterCallback(CallbackFunction callback);
// 用于觸發(fā)回調(diào)函數(shù)的執(zhí)行的函數(shù)聲明
extern "C" MY_SIMPLE_MATH_API void TriggerCallback(int a, int b, int& sum);
// 用于代替回調(diào)函數(shù),測(cè)試dll功能
extern "C" MY_SIMPLE_MATH_API void Sum(int a, int b, int& sum);
// 用于測(cè)試dll加載情況
extern "C" MY_SIMPLE_MATH_API int Test();
6)點(diǎn)擊dllmain.cpp,在里面編寫相關(guān)程序

CallbackFunction g_Callback = nullptr;
// 用于注冊(cè)回調(diào)函數(shù)的函數(shù)
extern "C" __declspec(dllexport) void RegisterCallback(CallbackFunction callback)
{
g_Callback = callback;
}
// 用于觸發(fā)回調(diào)函數(shù)的執(zhí)行
extern "C" __declspec(dllexport) void TriggerCallback(int a, int b, int& sum)
{
if (g_Callback)
{
g_Callback(a, b, sum);
}
}
extern "C" __declspec(dllexport) void Sum(int a, int b, int& sum)
{
sum = a + b;
}
extern "C" __declspec(dllexport) int Initialize() {
return 1;
}
7)選擇x86平臺(tái),之后在項(xiàng)目上右鍵,選擇生成或重新生成


生成的文件路徑

8)可在文件資源管理器中打開文件,進(jìn)入Debug文件夾,可找到生成的文件。


2 測(cè)試Dll
1)新建項(xiàng)目

2)選擇C++的控制臺(tái)

2)填寫項(xiàng)目名稱,選擇創(chuàng)建

3)將之前生成的dll和頭文件放在測(cè)試工程的文件夾下

4)在工程中添加cpp文件


5)在文件中編程
#include
#include
#include "MyCallbacks.h"
// 定義回調(diào)函數(shù)的簽名
typedef void (*CallbackFunction)(int a, int b, int& sum);
int main() {
int a = 3, b = 4, result = 0;
HMODULE dllHandle = LoadLibraryW(L"MyCallbacks.dll"); // 使用 LoadLibraryW,并使用 L前綴
if (dllHandle) {
// 獲取函數(shù)指針
auto registerCallback = reinterpret_cast(GetProcAddress(dllHandle, "RegisterCallback"));
auto triggerCallback = reinterpret_cast(GetProcAddress(dllHandle, "TriggerCallback"));
if (registerCallback && triggerCallback) {
// 注冊(cè)回調(diào)函數(shù)
registerCallback([](int a, int b, int& sum) {
sum = a + b;
});
// 觸發(fā)回調(diào)
triggerCallback(a, b, result);
std::cout < "Result after callback: " < result < std::endl;
}
FreeLibrary(dllHandle);
}
return 0;
}
6)將工程設(shè)置為啟動(dòng)項(xiàng)目

7)點(diǎn)擊調(diào)試運(yùn)行


8)測(cè)試運(yùn)行正常

-
dll
+關(guān)注
關(guān)注
0文章
116瀏覽量
46205 -
C++
+關(guān)注
關(guān)注
22文章
2119瀏覽量
75353 -
Visual
+關(guān)注
關(guān)注
0文章
255瀏覽量
34848 -
回調(diào)函數(shù)
+關(guān)注
關(guān)注
0文章
88瀏覽量
11902
發(fā)布評(píng)論請(qǐng)先 登錄
回調(diào)函數(shù)
labview怎么處理dll中的回調(diào)函數(shù)輸出值
C語言回調(diào)函數(shù)學(xué)習(xí)
C語言函數(shù)的回調(diào)函數(shù)
STM32編程時(shí),如何確定中斷回調(diào)函數(shù)的入口

評(píng)論