2012-03-20 29 views
2

私はwinapi関数でhello worldをやろうとしています。それは仕事の種類ですが、私はそれを適切な方法でやりたいです。WinAPI WriteConsoleでのコンソール出力

だから私はこのようなコードを持って:

int main(){ 
    HANDLE std_out; 
    int i; 
    char *error_msg; 

    std_out = GetStdHandle(STD_OUTPUT_HANDLE); 

    if(std_out == INVALID_HANDLE_VALUE){ 
     MessageBox(NULL,"stdout not available","Error",MB_OK); 
     return 1; 
    } 

    AttachConsole(ATTACH_PARENT_PROCESS); 

    if(!WriteConsoleA(std_out,"hhh\n",4,&i,NULL)){ 
     FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,NULL,GetLastError(),0,&error_msg,4,NULL); 
     MessageBox(NULL,error_msg,"Error",MB_OK); 
    } 

    return 42; 
} 

はまた、私は少し実験してるので、私は/エントリにリンク:メイン/サブシステム:

:窓

出力は次のように続いています

%PATH_TO_WORKING_DIR%>hhh(CRLF) 

私はRETURNを押してプログラムを終了するまで待っていますが、これはおそらく非常にcrapy "hello world"に同意します。そのPWDを取り除く方法とリターンを押す必要性は、読書のための非常に歓迎されています。

+0

おそらく 'main'の戻り値規則を読んでみたいです。 –

+0

start.exe/yourapp.exeを使用してプログラムを起動するか、AttachConsoleではなくAllocConsoleを呼び出すか、サブシステムをコンソールに設定する必要があります。 –

+0

@MikeKwan:それはここでは問題ではありません。 – Pyjong

答えて

3

これはコンソールアプリケーションのように動作させるGUIアプリケーションです。私はcmd.exe(または親が何であれ)を推測していますが、両方ともあなたが "自分"のstdoutだと思って混乱しています。/SUBSYSTEMと

リンク:CONSOLEと問題が離れて行く必要があります(そして、あなたは/ ENTRYまたはAttachConsoleへの呼び出しを必要としない)

あなたが実際にGUI /コンソールハイブリッドをしたい場合は、あなたが呼び出す必要がありますコンソールがない場合のAllocConsole(エクスプローラなどから起動)

+1

'/ SUBSYSTEM:CONSOLE'と' CreateWindow'を使うだけでGUI /コンソールハイブリッドを簡単に手に入れることができます。 – jamesdlin

+0

さて、私は実際にlibcをプレゼントしたくないと言っていたはずです。私はそれを私自身で設定したいと思います。しかし、現在どのように動作していても、サブシステムを変更することで助けになりました。とにかく、私がコードで行ったように、私がstdoutを管理することができない方法で何かを言及した、私が間違っている/間違っていることがありますか? AllocConsole、試してみました、クールな機能:)、thx – Pyjong

+0

メインはWindowsの本当のエントリーポイントではありません。コンソールツールの場合、MSツールチェーンを使用するとmainCRTStartupです(http://www.microsoft.comを参照)。 /msj/archive/S569.aspx) – Anders

関連する問題