[英]Debug an imported dll with VS 2010
I have a problem while I trying to call WinAPI functions from C# code.我在尝试从 C# 代码调用 WinAPI 函数时遇到问题。 I have lots of imports, many of them works fine, but some of them not and leading to unexpected break main program, without any message, exception type, nothing, just fell down all its windows and exit.
我有很多导入,其中许多工作正常,但其中一些没有并导致意外中断主程序,没有任何消息,异常类型,什么都没有,只是掉下所有窗口并退出。
I have two ways in code: via my developed library, where is more of winapi calls and I'm lazy to code specific structures, pointers, etc, and direct import from user32.dll, like this:我在代码中有两种方法:通过我开发的库,那里有更多的 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; ...
As I said, many of this calls works perfectly, but have problem of last two of them: ShowWindow() and PixelColor() with following code:正如我所说,其中许多调用都可以完美运行,但最后两个调用存在问题: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;
}
So, while I try to call directly imported ShowWindow() function, or library which calls api function(s), I got a program crash因此,当我尝试调用直接导入的 ShowWindow() 函数或调用 api 函数的库时,我遇到了程序崩溃
Is there any way how to debug external libraries and its results?有什么方法可以调试外部库及其结果吗?
What I¨m doing wrong?我做错了什么?
Thanks a lot非常感谢
You have several options for debugging issues.您有多种调试问题的选项。
WinDbg
.WinDbg
。 This would be my personal favorite option for debugging mixed applications. The P/Invoke problems: P/Invoke 问题:
HWND
should be passed to unmanaged code using IntPtr
.HWND
应该使用IntPtr
传递给非托管代码。DWORD
is always 32 bit. DWORD
始终为 32 位。 Also, LONG
(all caps) is not the same as long
(lower case).LONG
(全部大写)与long
(小写)不同。 The C++ Problems: C++ 问题:
LPPOINT
is never initialized, so when you call ClientToScreen()
you're accessing uninitialized stack garbage as a pointer, and assigning values.LPPOINT
从未初始化,因此当您调用ClientToScreen()
您将未初始化的堆栈垃圾作为指针访问并分配值。 To Fix it you could:LocalAlloc
, GlobalAlloc
, malloc
, calloc
.LocalAlloc
, GlobalAlloc
, malloc
, calloc
。POINT point;
POINT point;
, assign values using point.x
& point.y
, and use it in the function call as &point
. point.x
& point.y
分配值,并在函数调用中使用它作为&point
。HWND
.HWND
。 The API types, even though they are ultimately typedefs, carry extra meaning with them.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.