Не удалось использовать класс многократного использования GetWindowTextLength и GetClassName в новом проекте? - PullRequest
0 голосов
/ 03 октября 2018

Я столкнулся с очень странным поведением в одном из моих решений, и мне нужна помощь, чтобы решить эту проблему.Я использую C # в Visual Studio 2015.

У меня есть проект библиотеки классов, который имеет следующее:

[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
static extern int GetWindowTextLength(IntPtr hWnd);

[DllImport("User32.dll", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
static extern long GetClassName(IntPtr hwnd, StringBuilder lpClassName, long nMaxCount);

string getHWNDCaption(IntPtr hwnd)
{
    if (hwnd == IntPtr.Zero) throw new Exception("getHWNDCaption: Invalid pointer!");
    string caption = "";
    StringBuilder windowText = null;
    try
    {
        int max_length = GetWindowTextLength(hwnd);
        windowText = new StringBuilder("", max_length + 50);
        GetWindowText(hwnd, windowText, max_length + 2);
    .....

string getHWNDClassName(IntPtr hwnd)
{
    if (hwnd == IntPtr.Zero) throw new Exception("ExternalWindowsInfo not initiated!");
    string className = "";
    StringBuilder classText = null;
    try
    {
        int cls_max_length = 1000;
        classText = new StringBuilder("", cls_max_length + 5);
        GetClassName(hwnd, classText, cls_max_length + 2);
    .......

В старом проекте Windows Form я выполняю эти функции, и они возвращают необходимыеdata.

Я пытался добавить новый проект формы Windows в то же решение, и при выполнении тех же функций я получаю следующую ошибку, которую я не могу перезапустить:

 A call to PInvoke function ...::GetWindowTextLength' has unbalanced the stack. This is likely because the managed PInvoke signature does not match the unmanaged target signature. Check that the calling convention and parameters of the PInvoke signature match the target unmanaged signature.

При использованиитот же код, я считаю, что это что-то в определении проекта, но не могу узнать, что.Любая помощь будет оценена!

1 Ответ

0 голосов
/ 03 октября 2018

На самом деле я побежал еще немного, и благодаря Мэтью Уотсону , который дал подсказку:

  1. Я сохраняю CallingConvention = CallingConvention.Cdecl
  2. Я заставил проект использовать платформу x64 (на самом деле снял флажок «Предпочитать 32-битный», но я уверен, что это правильно) в свойствах проекта -> Построить.

Спасибо!

...