c# - 为 C# P/Invoke 调用 C++ dll 获取正确参数时出现问题

标签 c# pinvoke oracle-outside-in

尝试从 Oracle 的 Outside In API 互操作功能。 具有以下功能:

SCCERR EXOpenExport {VTHDOC hDoc, VTDWORD dwOutputId, VTDWORD dwSpecType, 
VTLPVOID pSpec, VTDWORD dwFlags, VTSYSPARAM dwReserved, VTLPVOID pCallbackFunc, 
VTSYSPARAM dwCallbackData, VTLPHEXPORT phExport);

我从头文件中将参数减少为:
typedef VTSYSPARAM VTHDOC,VTLPHDOC *
typedef DWORD_PTR VTSYSPARAM
typedef unsigned long DWORD_PTR

typedef unsigned long VTDWORD   

typedef VTVOID* VTLPVOID  
#define VTVOID void  

typedef VTHDOC VTHEXPORT, *VTLPEXPORT  
These are for 32 bit windows 

浏览头文件、示例程序和我找到的文档:
1. pSpec 可以是指向缓冲区或 NULL 的指针,因此我将其设置为 IntPtr.Zero(文档)。
2. dwFlags 和 dwReserved 根据文档“必须由开发人员设置为 0”。
3. 如果我不想处理回调,可以将 pCallbackFunc 设置为 NULL。
4. 最后两个基于我为使用 [StructLayout(LayoutKind.Sequential)] 编写的 C# 包装器的结构。然后通过首先使用 Marshal.AllocHGlobal(Marshal.SizeOf(instance)) 创建一个 IntPtr 来实例化一个实例并生成参数,然后获取作为 dwCallbackData 的 uint 和 phExport 的 IntPtr 传递的地址值。

最终的参数列表如下: 1. phDoc 作为一个 IntPtr,它被调用的 DAOpenDocument 函数加载了一个地址 之前。
2. dwOutputId as uint 设置为 1535 表示 FI_JPEGFIF
3. dwSpecType as int 设置为 2 表示 IOTYPE_ANSIPATH
4. pSpec 作为 IntPtr.Zero 输出将被写入
5. dwFlags as uint 按照指示设置为 0
6. dwReserved as uint 按照指示设置为 0
7. pCallbackFunc 作为 IntPtr 设置为 NULL,因为我将处理结果
8. dwCallBackDate 作为 uint 结构缓冲区的地址
9. phExport as IntPtr 到另一个struct buffer

仍然从 API 得到一个未定义的错误。这意味着该调用返回一个 961,它未在任何头文件中定义。过去,当我选择的参数类型不正确时,我会得到这个。
我开始使用 Interop Assistant,它有助于了解有多少参数类型被翻译。然而,它受到我从头文件中收集正确 native 类型的能力的限制。比如前面函数中使用的hDoc参数被定义为一个非文件系统句柄,于是尝试用Marshal创建一个句柄,然后使用了一个IntPtr,最后变成了一个int(实际上这里使用的是&phDoc ).
那么,除了反复试验之外,还有更科学的方法吗?
吉姆

最佳答案

您可以搜索http://pinvoke.net对于现有解决方案,或者您可以尝试 PInvoke Signature Toolkit .这些可能会提供一些帮助。

关于c# - 为 C# P/Invoke 调用 C++ dll 获取正确参数时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2493663/

相关文章:

c# - NSubstitute - 模拟在返回 void 的方法中抛出异常

c# - DLLImport:传递短类型参数

vb.net - PInvoke FormatMessage Message ByRef lpBuffer As [String] 没有

c# - 将结构数组从 C#(.NET Core) 传递到 C++(unamnaged)

javascript - Oracle Outside In Web View Export JavaScript API加载问题

c# - UWP 与 ITextRange 接口(interface)的使用。 WPF 中的 TextRange 对象

c# - 为什么 File.WriteAllBytes 不适用于 .db 文件但适用于 .csv 文件?

c# - 在 Windows 窗体应用程序 c# 中选择两个日期之间的查询