У меня проблема при попытке вызвать функции WinAPI из кода C#. У меня много импорта, многие из них прекрасно работают, но некоторые из них не приводят к неожиданным прерываниям основной программы, без какого-либо сообщения, типа исключения, ничего, просто упали все его окна и выходят.Отладка импортированной dll с VS 2010
У меня есть два пути в коде: через мою развитом библиотеку, где есть больше 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 fu nction (s), я получил программный сбой
Есть ли способ отладки внешних библиотек и его результатов?
Что я делаю неправильно?
Большое спасибо
Параметры * hwnd * должны иметь тип ['IntPtr'] (https://msdn.microsoft.com/en-us/library/system.intptr.aspx). Кроме того, вы пишете в неинициализированную память: нет памяти для точки LPPOINT; '. Это указатель. – IInspectable
VS - включить встроенный код отладки (_ и не только мой код, что-то вроде этого_), сломать все исключения. [OllyDbg] (http://www.ollydbg.de/), [IDA Freeware] (https://www.hex-rays.com/products/ida/support/download_freeware.shtml) – MrDywar
[DWORD - 32 бит. Он тоже неподписан.] (Https://msdn.microsoft.com/en-us/library/windows/desktop/aa383751%28v=vs.85%29.aspx) – theB