GetWindowTextLength和GetClassName可重用类在新项目上失败?

时间:2018-10-03 07:58:17

标签: c# visual-studio-2015 pinvoke user32

我的一种解决方案遇到了一个非常奇怪的行为,我需要帮助来解决这个问题。 我在Visual Studio 2015上使用C#。

我有一个Class库项目,该项目具有以下内容:

[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窗体项目中,我执行这些功能,然后它们返回所需的数据。

我尝试将新的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 :(得分:0)

实际上,我的跑位还要多一些,感谢Matthew Watson提供了一个线索:

  1. 我保留了CallingConvention = CallingConvention.Cdecl
  2. 我在项目属性->生成中强制项目使用平台x64(实际上取消选中“首选32位”是可以的,但我可以确定)。

谢谢!