【发布时间】:2011-10-30 09:43:29
【问题描述】:
首先 - 我知道如何调用非托管函数。我坚持使用非托管 dll 中的接口方法。我认为,编写包装器 - 是我所需要的。
请帮我写真正的代码。
我有:
- 旧 DLL (C);
- 2个头文件;
- lib 文件(有什么用?)。
- !没有来源!
这是 .h 文件中的一些代码(兴趣点 - 声明接口):
#ifdef __BUILD_DLL
#define BLNETPASS_EXPORT __declspec(dllexport)
#else
#define BLNETPASS_EXPORT
#endif
#include "BlNetpassUid.h"
extern "C"
{
BLNETPASS_EXPORT HRESULT WINAPI BlNetPassCreateA
(LPCSTR pHostName, const GUID *, VOID **);
BLNETPASS_EXPORT HRESULT WINAPI BlNetPassCreateW
(LPCWSTR pHostName, const GUID *, VOID **);
BLNETPASS_EXPORT HRESULT WINAPI CanBeUnload (DWORD dTimeout );
...
#ifdef UNICODE
#define BlNetPassCreate BlNetPassCreateW
#else
#define BlNetPassCreate BlNetPassCreateA
#endif
#undef INTERFACE
#define INTERFACE INetPass
DECLARE_INTERFACE_ (INetPass, IUnknown)
{
// IUnknown methods
STDMETHOD ( QueryInterface)(REFIID, VOID **) PURE;
STDMETHOD_ (ULONG, AddRef)() PURE;
STDMETHOD_ (ULONG, Release)() PURE;
// INetPass methods
STDMETHOD ( CreateNetPassEnum)(VOID **, REFIID cid,
REFIID iid) PURE;
};
我认为它不是 COM 对象,我不能为此 dll 使用类型库导入
我需要什么:
- 调用 BlNetPassCreateA;
- 获取指向接口 INetPass 的指针;
- 调用接口方法CreateNetPassEnum。
这就是我之前的做法(它是 PInvoke):
[DllImport("BlNetpassApi")]
public static extern int BlNetPassCreateA(string pHostName, ref Guid GUID, out IntPtr rINetPass);
...
...
IntPtr something;
Guid temp_guid = Guid.Empty;
int temp_int = BlNetPassCreateA(null, ref temp_guid, out something);
好的! IntPtr 包含一些数据,但接下来是什么 - 我如何描述背后的接口并调用其方法?
【问题讨论】:
-
DECLARE_INTERFACE_用于声明 COM 接口(@987654325@ 的存在也是一个很大的好处)。所以我认为它是一个 COM 对象。 -
也许你是对的......这是第三方软件:他们不能给我 C# 示例,但他们告诉我 - 你可以编写包装器
-
为什么don
t you simply try to add reference to this dll? If its COM,它将与COM生成的包装器一起导入。如果没有,请继续思考:) -
它不是 COM 组件
-
我认为这里有一个很好的建议msdn.microsoft.com/en-us/library/ms973872.aspx。对于一些复杂的非托管 API,您可以在 C++ 中创建一个简单的包装器,然后通过 PInvoke 从您的代码中调用它。甚至创建托管 C++ 库,然后从 C# 本地调用它。从您的示例看来,编写 C++ 包装器将是一项简单的任务。