P/调用,查找/声明函数入口点时遇到问题
P/Invoke, trouble finding/declaring function entry point
我在C++ dll上进行P/Invoke调用时遇到一些困难。 我收到"找不到入口点"错误。
在C++中,我像这样公开函数...
#ifdef __cplusplus
extern "C" {
#endif
__declspec(dllexport)
long
WINAPI
MgScSCardUIDlgSelectCardW(__inout LPOPENCARDNAMEW_EX pOcne);
#ifdef __cplusplus
}
#endif
C# 中的 dllimport 语句如下所示:
[DllImport("mgsc.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
public static extern Int32 MgScSCardUIDlgSelectCardW([MarshalAs(UnmanagedType.Struct)] [In, Out] ModWinsCard.OPENCARDNAME_EX ocnwex);
我已经尝试过这个,没有调用约定、标准和 winapi 调用约定。 与所有结果相同。 我用DependencyWalker查看了公开的函数,看到它显示为"_MgScSCardUIDlgSelectCardW@4"。 我知道装饰是正常的(但是声明"extern "C"应该处理这个问题??),但从未见过任何示例代码,其中 dllimport 的函数看起来像这样,所以看起来好像不是我应该这样称呼它。
我已经在这里看到了推荐 .def 文件的答案,但我宁愿不必处理这个问题,因为当我只需要完成这项工作时,这只是我要学习和搞砸的另一件事。
DLL一切正常。 您将获得编译器添加到名称中的 @4 后缀的好处。 它描述了传递给函数的参数值的大小,结构指针为 4 个字节。这会捕获客户端代码中函数声明中的错误,此类不匹配可能很难排除故障,因为它们会使堆栈不平衡。
这在这里也很好用,你几乎可以肯定声明函数是错误的。 您声明OPENCARDNAME_EX为结构而不是类的几率为 99%。 这要求您通过引用而不是值传递参数。 [元帅]属性也是错误的。 修复:
[DllImport("mgsc.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
public static extern Int32 MgScSCardUIDlgSelectCardW(ref ModWinsCard.OPENCARDNAME_EX ocnwex);
相关文章:
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 代码问题.使用矢量删除相同的数字,除了它的最后一个入口
- 生成文件问题(体系结构x86_64的未定义符号:"_main",引用自:主可执行文件的隐式入口/启动)
- 初学者问题 - 致命错误LNK1561:必须定义入口点
- P/调用,查找/声明函数入口点时遇到问题
- 提升单元测试入口点问题
- DllImport修饰名称问题-无法找到入口点
- 需要的DLL入口点问题/建议