CランタイムライブラリDLLを使用してputsを呼び出すのは悪い例です。良い情報があるのでチュートリアルを読んでおいてください。代わりにWin32 API呼び出しを行ってみてください。 http://msdn.microsoft.com/en-us/magazine/cc164123.aspx
それは古いですが、情報はまだ良いです:
は、ここでのp /呼び出すためのより良い紹介です。
編集
は私のexplainationは間違っていました。
正しい説明を探して、Cランタイムがメソッドを置き、.NET Framework Console.Writeメソッドがコンソールに書き込む方法が異なることを発見しました(Console.Writeはp/invoke to putsではない)。私は答えがそこにあったかもしれないと思ったので、私はこのデモ手早く:でも有効ホスティングプロセスで、デバッガの下でそれらに成功し、出力の
using System;
using System.Diagnostics;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;
class Program
{
public static void Main()
{
int written;
string outputString = "Hello, World!\r\n";
byte[] outputBytes = Encoding.Default.GetBytes(outputString);
//
// This is the way the C-Runtime Library method puts does it
IntPtr conOutHandle = CreateFile("CONOUT$", 0x40000000, FileShare.ReadWrite, IntPtr.Zero, FileMode.Open, 0, IntPtr.Zero);
WriteConsole(conOutHandle, outputBytes, outputString.Length, out written, IntPtr.Zero);
//
// This is the way Console.Write does it
IntPtr stdOutputHandle = GetStdHandle(STD_OUTPUT_HANDLE);
WriteFile(stdOutputHandle, outputBytes, outputBytes.Length, out written, IntPtr.Zero);
// Pause if running under debugger
if (Debugger.IsAttached)
{
Console.Write("Press any key to continue . . . ");
Console.ReadKey();
}
}
const int STD_OUTPUT_HANDLE = -11;
[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr GetStdHandle(int nStdHandle);
[DllImport("kernel32.dll", SetLastError = true)]
static extern int WriteFile(IntPtr handle, [In] byte[] bytes, int numBytesToWrite, out int numBytesWritten, IntPtr mustBeZero);
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern IntPtr CreateFile(string lpFileName, int dwDesiredAccess, FileShare dwShareMode, IntPtr securityAttrs, FileMode dwCreationDisposition, int dwFlagsAndAttributes, IntPtr hTemplateFile);
[DllImport("kernel32.dll", CharSet = CharSet.Ansi, SetLastError = true)]
static extern bool WriteConsole(IntPtr hConsoleOutput, [In] byte[] lpBuffer, int nNumberOfCharsToWrite, out int lpNumberOfCharsWritten, IntPtr mustBeZero);
}
両方を。だからそれは終わりです。
私はそれを誰かに理解させるためにそれを共有したかったなぜそれは起こる - ハンス?
a)「機能しない」とはどういう意味ですか? b)PrintCharは何をしていますか? –
「うまくいかない」とは、それが何を言っているのかを正確に意味します。この関数は、コンソールに書き込む予定のタスクを実行しません。それでも値を返し、プログラムをクラッシュさせません。もしそうなら、私はそれを書き留めたでしょう。 PrintChar(char c){putchar(c); } それはすべてです!そして、それはデバッグをしているかどうかは分かりません:) – ATC