gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:44:39 27 4
gpt4 key购买 nike

尝试从 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com