2015-06-21 60 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