5 c# c++ winapi interop struct
我正在拦截 Win32 API 调用本机 dll 或 exe 正在使用某种挂钩从 C# 执行。在这种特殊情况下,我对 user32.dll 中的 DrawText() 感兴趣。它在 Win32 API 中是这样声明的:
INT WINAPI DrawTextW(HDC hdc, LPCWSTR str, INT count, LPRECT rect, UINT flags)
Run Code Online (Sandbox Code Playgroud)
LPRECT 结构具有以下签名(也在 Win32 API 中):
typedef struct tagRECT {
LONG left;
LONG top;
LONG right;
LONG bottom;
} RECT LPRECT;
Run Code Online (Sandbox Code Playgroud)
LONG 是 32 位系统上 32 位整数的 typedef(不知道 64 位系统,在这一点上无关紧要,因为我在 32 位 Windows 上)。为了能够访问这个结构的成员,我在我的 C# 代码中声明了它......
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct RECT
{
public Int32 left;
public Int32 top;
public Int32 right;
public Int32 bottom;
}
Run Code Online (Sandbox Code Playgroud)
...并使用此 RECT 结构编写 P/Invoke 的签名:
[DllImport("user32.dll", CharSet = CharSet.Unicode, SetLastError = true, CallingConvention = CallingConvention.StdCall)]
static extern IntPtr DrawText(IntPtr HDC, String str, Int32 count, ref RECT rect, UInt32 flags, IntPtr dtp);
Run Code Online (Sandbox Code Playgroud)
由于结构是 C# 中的值类型,而不是 C/C++ 中的引用类型,因此这里需要 ref 修饰符。
但是,当我使用rect.top rect.left
etc 时,它们几乎总是返回 0。我知道这是不正确的。但是在谷歌搜索无数小时并尝试了很多不同的事情之后,我无法让这个简单的东西起作用。
我尝试过的事情:
unsafe
代码块。没有用,但我可能在实现中犯了一个错误(我不记得我做了什么)。除了这种方法通常保留用于 COM 和 Win32 中棘手的指针情况之外,无论如何对于我的情况来说都是过大的。[MarshallAs]
在 RECT 的成员之前添加。没什么区别。Pack
价值观。没有不同。我相当确定我错过了一些非常简单和直接的东西,但我不知道它是什么......
任何帮助表示赞赏。谢谢你。
归档时间: |
|
查看次数: |
6147 次 |
最近记录: |