使用dllimport接收的void指针[MSVS c++ 2010]
Using void pointer received by dllimport [MSVS C++ 2010]
我需要写一个DLL(与MSVS 2010 PS1),调用从exe导出的函数:
(dll.h): extern "C" __declspec(dllimport) void* __stdcall SomeFunction();
问题是void指针可以指向任何数据类型,并且exe开发人员没有提供任何关于如何使用此函数的指导。幸运的是,exe项目是开源的,我可以看到SomeFunction实际上返回一个指向结构的指针,这是在structures.h文件中声明的,用于编译exe:
struct exeStructure {int useme; int usecallback; <...> };
- 我如何使用这些信息来设置usecallback变量从DLL?你能举个例子吗?
- 我应该如何解除引用void* SomeFunction到exeStructure?
- 我需要复制和包括结构。h文件在我的DLL项目?
您应该将void *的值赋给exeStructure *类型。
你可以通过static_cast(更好):
exeStructure * exeStrPtr = static_cast<exeStructure*>(voidPtr);
或者通过c风格的强制转换(本质上是相同的,但不建议):
exeStructure * exeStrPtr = (exeStructure *)voidPtr;
那么你就可以按照你的期望使用合适的指针了。
exeStrPtr->usecallback = 1;
exeStrPtr->useme = 334;
有关c++中最常见类型的强制转换之间的差异的更多详细信息,请参阅这个问题:
相关文章:
- std::multimap<std::chrono::milliseconds, T>::rbegin 在 MSVS-13 中指向 end()?
- 标准对此指向成员函数类型模板参数有何说明?是我的代码有误,还是 MSVS 16.6 有问题?
- C++20 概念测试在 MSVS 16.5 中不起作用
- boost::stacktrace on Windows MSVS 2017
- 为什么这个自定义分配器的析构函数在 GCC/MSVS 的 stdlib 中被调用两次
- 为什么我可以在 MSVS 中使用 size_t 和 std::size_t 而不使用传统的标头?
- MSVS 2015, C++, 使用参数调用构造函数会导致错误
- 为什么 MSVS 静态分析器忽略_Check_return_
- 如何在何处获取 MSVS 2008(32 位)编译器工具链的编译器,而无需安装 MSVS2008
- 如何让 MSVS 识别 bigobj 标志?
- MSVS 别名错误 C2988 (C++)
- MAPViewOffileex的MSVS链接错误
- MSVS 2015构建DLL-在MSVCRTD.LIB(EXE_MAIN.OBJ)中的Indoke_main中未解决的外
- 在可变参数模板类中使用可变参数进行显式专用化 [MSVS '12:12 年 11 月 CTP:错误 C3522]
- MSVS 2015 显式错误 C4146 - 应用于无符号类型的一元减号运算符
- CMake 不生成 MinGW makefile,而是生成 MSVS 2013
- is compare_exchange_weak for std::shared_ptr broken in msvs
- 链接器错误。MinGW 无法从 MSVS dll 导出类
- 在MSVS 2010中同时设置多个断点
- 运算符重载:正常 MSVS,但在 g++ 中失败