DLL 導出「註冊回調」函數,應用層傳入函數指標/委派/lambda,DLL 內部事件發生時呼叫該回調。
// DLL 端
typedef void (__stdcall *EventCallback)(int eventId, const char* data, void* userData);
__declspec(dllexport) void RegisterCallback(EventCallback cb, void* userData);
__declspec(dllexport) void UnregisterCallback();
// DLL 內部事件觸發
void OnDevicePhotoReady(const char* path) {
if (g_callback) g_callback(EVENT_PHOTO_READY, path, g_userData);
}
void __stdcall MyHandler(int id, const char* data, void* ctx) {
if (id == EVENT_PHOTO_READY) {
std::cout << "Photo: " << data << std::endl;
// 更新 UI、存檔等
}
}
int main() {
RegisterCallback(MyHandler, nullptr);
// ... 執行觸發拍照的操作 ...
UnregisterCallback();
return 0;
}
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
delegate void EventCallback(int eventId, string data, IntPtr userData);
[DllImport("MyDll.dll", CallingConvention = CallingConvention.StdCall)]
static extern void RegisterCallback(EventCallback cb, IntPtr userData);
static EventCallback _handler = (id, data, ctx) => { /* ... */ };
RegisterCallback(_handler, IntPtr.Zero);
// 注意:_handler 必須保持存活防止 GC 回收,通常設為 static 欄位
struct EventData {
int eventId;
int64_t timestamp;
char payload[256];
};
typedef void (__stdcall *EventCallbackEx)(const EventData* evt, void* userData);
__stdcall / CallingConvention.StdCall)。UnregisterCallback,避免野指標呼叫。「設備生成後直接調用回調函數」