从托管代码访问GetConsoleHistoryInfo()

时间:2015-06-21 19:03:31

标签: c# winapi console-application dllimport managed

我有一个模糊的Java背景,刚刚安装了Visual Studio社区2015.玩它的所以有一个控制台应用程序启动并运行,并希望在连接到不同的控制台后使用上述功能。麻烦的是我不知道这个函数的适当声明 - 有人可以告诉我这个实例应该是什么,但是对我来说也是一个很好的指针,所以我可以自己解决。 IDE似乎没什么帮助

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 个答案:

答案 0 :(得分: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;
} 

可以在Tuckey UrlRewriteFilter example找到许多有用的PInvoke信息。但是,您应该对MSDN进行双重检查以确定它是否适合。