繁体   English   中英

使用 VS 2010 调试导入的 dll

[英]Debug an imported dll with VS 2010

我在尝试从 C# 代码调用 WinAPI 函数时遇到问题。 我有很多导入,其中许多工作正常,但其中一些没有并导致意外中断主程序,没有任何消息,异常类型,什么都没有,只是掉下所有窗口并退出。

我在代码中有两种方法:通过我开发的库,那里有更多的 winapi 调用,我懒得编写特定的结构、指针等,直接从 user32.dll 导入,如下所示:

[DllImport(@"tradeInterop.dll")]
    public static extern void ChooseInstrumentByMouse(UInt32 hwnd, int baseX, int baseY, int idx, int _isDown);
    [DllImport(@"tradeInterop.dll")]
    public static extern void PutNumber(int num);
    [DllImport(@"tradeInterop.dll")]
    public static extern void PutRefresh();
    [DllImport(@"user32.dll")]
    public static extern UInt32 FindWindow(string sClass, string sWindow);
    [DllImport(@"user32.dll")]
    public static extern int GetWindowRect(uint hwnd, out RECT lpRect);
    [DllImport(@"user32.dll")]
    public static extern int SetWindowPos(uint hwnd, uint nouse, int x, int y, int cx, int cy, uint flags);
    [DllImport(@"user32.dll")]
    public static extern int LockSetForegroundWindow(uint uLockCode);
    [DllImport(@"user32.dll")]
    public static extern int SetForegroundWindow(uint hwnd);
    [DllImport(@"user32.dll")]
    public static extern int ShowWindow(uint hwnd, int cmdShow);
    [DllImport(@"tradeInterop.dll")]
    public static extern ulong PixelColor(uint hwnd, int winX, int winY); //tried (signed) long and both ints as return type, same result (WINAPI says DWORD as unsigned long, what about 64-bit assembly where compiled both lib and program?
    public struct RECT
    {
        public int Left;        
        public int Top; ...

正如我所说,其中许多调用都可以完美运行,但最后两个调用存在问题:ShowWindow() 和 PixelColor(),代码如下:

extern "C" __declspec(dllexport) COLORREF __stdcall PixelColor(unsigned hwnd, int winX, int winY)
{
    LPPOINT point;
    point->x = winX;
    point->y = winY;
    ClientToScreen((HWND) hwnd, point);
    HDC dc = GetDC(NULL);
    COLORREF colorPx = GetPixel(dc, point->x, point->y);
    ReleaseDC(NULL, dc);
    return colorPx;
}

因此,当我尝试调用直接导入的 ShowWindow() 函数或调用 api 函数的库时,我遇到了程序崩溃

有什么方法可以调试外部库及其结果吗?

我做错了什么?

非常感谢

您有多种调试问题的选项。

  1. 在 Visual Studio 中启用非托管代码调试。 注意:VS 2010 Express 不支持混合托管/非托管调试。 ( 说明)
  2. 使用WinDbg 这将是我个人最喜欢的调试混合应用程序的选项。 这是一个非常强大的工具。 诚然,学习曲线有点陡峭,但值得付出努力。
  3. 使用像 OllyDbg 这样的外部/第三方调试器。 (根据MrDywar 的建议)

P/Invoke 问题:

  1. 正如IInspectable指出的那样, HWND应该使用IntPtr传递给非托管代码。
  2. Windows API 数据类型定义明确。 DWORD始终为 32 位。 此外, LONG (全部大写)与long (小写)不同。

C++ 问题:

  1. 正如IInspectable所提到的, LPPOINT从未初始化,因此当您调用ClientToScreen()您将未初始化的堆栈垃圾作为指针访问并分配值。 要修复它,您可以:
    1. 分配内存(你最喜欢的方案, LocalAllocGlobalAllocmalloccalloc
    2. 使申报POINT point; ,使用point.x & point.y分配值,并在函数调用中使用它作为&point
  2. 使第一个参数的类型为HWND API 类型,即使它们最终是 typedef,也带有额外的含义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM