[源码和文档分享]两种方式实现DLL导出函数之dllexport与def文件导出

背景

我们开发DLL的时候,大部分都会导出函数。对于导出函数,常用的有两种方式,一种是使用 dllexport 关键字导出,另一种是使用 .def 文件导出。我个人比较喜欢用后一种方式导出函数,因为用起来比较省心、方便。

现在,我就把这部分知识整理成文档,分享给大家。

参考文档和完整的文档和源码下载地址:

https://www.write-bug.com/article/1588.html

转载于:https://my.oschina.net/u/4188102/blog/3092339

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的 `hid.dll` 导出函数的示例代码,供参考: ```c #include <Windows.h> #include <hidsdi.h> BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { switch (fdwReason) { case DLL_PROCESS_ATTACH: // DLL 初始化 break; case DLL_PROCESS_DETACH: // DLL 卸载 break; case DLL_THREAD_ATTACH: // 新线程创建 break; case DLL_THREAD_DETACH: // 线程结束 break; } return TRUE; } // 导出函数:获取 HID 设备信息 extern "C" __declspec(dllexport) BOOL GetHidDeviceInfo( DWORD dwVendorId, // 设备厂商 ID DWORD dwProductId, // 设备产品 ID PHIDD_ATTRIBUTES pHidAttributes // 输出设备属性结构体 ) { BOOL bResult = FALSE; HDEVINFO hDeviceInfo = NULL; // 枚举所有 HID 设备 hDeviceInfo = SetupDiGetClassDevs(&GUID_DEVINTERFACE_HID, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); if (hDeviceInfo == INVALID_HANDLE_VALUE) { return FALSE; } // 遍历所有 HID 设备 DWORD dwIndex = 0; SP_DEVICE_INTERFACE_DATA deviceInterfaceData = { 0 }; deviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); while (SetupDiEnumDeviceInterfaces(hDeviceInfo, NULL, &GUID_DEVINTERFACE_HID, dwIndex, &deviceInterfaceData)) { // 获取设备接口数据 DWORD dwRequiredSize = 0; SetupDiGetDeviceInterfaceDetail(hDeviceInfo, &deviceInterfaceData, NULL, 0, &dwRequiredSize, NULL); if (dwRequiredSize == 0) { break; } PSP_DEVICE_INTERFACE_DETAIL_DATA pDeviceInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)LocalAlloc(LPTR, dwRequiredSize); if (pDeviceInterfaceDetailData == NULL) { break; } pDeviceInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); if (SetupDiGetDeviceInterfaceDetail(hDeviceInfo, &deviceInterfaceData, pDeviceInterfaceDetailData, dwRequiredSize, NULL, NULL)) { // 打开设备 HANDLE hDevice = CreateFile(pDeviceInterfaceDetailData->DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if (hDevice != INVALID_HANDLE_VALUE) { // 获取设备属性 HIDD_ATTRIBUTES hidAttributes = { 0 }; hidAttributes.Size = sizeof(HIDD_ATTRIBUTES); if (HidD_GetAttributes(hDevice, &hidAttributes)) { // 比较设备厂商 ID 和产品 ID if (hidAttributes.VendorID == dwVendorId && hidAttributes.ProductID == dwProductId) { // 输出设备属性 CopyMemory(pHidAttributes, &hidAttributes, sizeof(HIDD_ATTRIBUTES)); bResult = TRUE; CloseHandle(hDevice); break; } } CloseHandle(hDevice); } } LocalFree(pDeviceInterfaceDetailData); ++dwIndex; } SetupDiDestroyDeviceInfoList(hDeviceInfo); return bResult; } ``` 此示例代码中,我们定义了一个名为 `GetHidDeviceInfo` 的函数,该函数可以用来获取指定厂商 ID 和产品 ID 的 HID 设备的属性信息。我们将该函数作为 `hid.dll` 的导出函数,供其他程序调用。 需要注意的是,在 `DllMain` 函数中,我们可以进行 DLL 的初始化和卸载工作,例如打开和关闭一些资源,但是我们需要避免在此函数中进行太多的操作,以免影响系统的性能和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值