2015-06-21 45 views
2

我已经有了一个模糊的Java背景并且刚刚安装了Visual Studio Community 2015.使用它可以让控制台应用程序启动并运行,并且想要在连接到不同的控制台后使用上述功能。麻烦是我不知道这个功能的适当声明 - 有人可以告诉我在这个例子中应该是什么,但对我来说也是一个很好的指针,所以我可以自己解决。该IDE似乎并没有多大帮助从托管代码访问GetConsoleHistoryInfo()

using System.Runtime.InteropServices; 

namespace ConsoleStuff 
{ 
    class Program 
    { 
     [DllImport("kernel32.dll", SetLastError = true)] 
     public static extern bool GetConsoleHistoryInfo(); 

     static void Main(string[] args) 
     { 
        GetConsoleHistoryInfo(); // <-- PInvokeStackImbalance occurred 
     } 
    } 
} 

回答

1

你应该声明它是这样的:

[DllImport("kernel32.dll", SetLastError = true)] 
static extern bool GetConsoleHistoryInfo(ref CONSOLE_HISTORY_INFO ConsoleHistoryInfo); 

您将需要CONSOLE_HISTORY_INFO类型也为这个工作:

[StructLayout(LayoutKind.Sequential)] 
public struct CONSOLE_HISTORY_INFO 
{ 
    uint cbSize; 
    uint HistoryBufferSize; 
    uint NumberOfHistoryBuffers; 
    uint dwFlags; 
} 

一许多有用的PInvoke信息可以在PInvoke.net找到。你应该再次检查它对MSDN,看看它是否适合。

+0

谢谢 - 哪里是获取此类信息的最佳资源? – user1561108

+1

[pinvoke.net](http://www.pinvoke.net)是P/Invoke最棘手的资源。期。这是完全错误的股票,这个结构声明也不例外:原生数据类型'UINT'是32位,而不是**映射到C#的'ushort'(16位)。请参阅[使用平台调用封装数据](https://msdn.microsoft.com/zh-cn/library/fzhhdwae.aspx)以获得可靠的参考。 – IInspectable

+0

@IInspectable HM,看起来你是对的。这很奇怪,一次很可靠。 – nvoigt