2009-01-11 15 views

cevap

13

Eh, temel farktır:

  • AllocConsole() yeni bir konsolu (ve ona bağlanması) olacak
  • AttachConsole(ATTACH_PARENT_PROCESS /* -1 */) yeni konsolu oluşturmaz, bu ebeveynin mevcut konsoluna eklemek olacaktır süreci.

İlk durumda yeni bir konsol penceresi alırsınız, ikinci durumda, var olan bir konsol penceresini kullanırsınız.

Elbette, eğer zaten bir konsola bağlıysanız (yani., Cmd.exe'den başlatılan bir konsol modu programısınız) pek bir fark yoktur - API ile bir hata alırsınız.

Ayrıca, bir konsoldan ayrılmanızın bağımsız konsolun yararlı olacağı anlamına gelmediğini unutmayın - örneğin, bir cmd penceresinden başlatılan bir konsol işlemiyse, bu pencere işleminiz bitene kadar engellenir.

ile oynamak için bazı kod:

int main(int argc, char* argv[]) 
{ 
    int ch; 
    BOOL bResult; 

    printf("default console\n"); 
    ch = getchar(); 

    bResult = FreeConsole(); 
    bResult = AllocConsole();  
    printf("AllocConsole()\n"); 
    ch = getchar(); 

    bResult = FreeConsole(); 
    bResult = AttachConsole(ATTACH_PARENT_PROCESS);  
    printf("AttachConsole(ATTACH_PARENT_PROCESS)\n"); 
    ch = getchar(); 

    return 0; 
} 
+1

bu Windows Programı (ve bir konsol Programı) olarak derlenmiş bir yürütülebilir dosya için konsol pencere oluşturmak için C# .NET kullanılabilir mi? – configurator

+2

Evet yapabilir. Ancak bir konsol elde etmek çok daha kolaydır, sadece projenin Çıkış Tipini Konsol Uygulamasına değiştirin. –

+0

@configuratoir - bunu yapabileceğinizi bildiğim kadarıyla ama Win32 API'lerini çağırmak için p/invoke kullanmanız gerekeceğini düşünüyorum (bu API'lar için büyük bir anlaşma değil) - Çerçeve eşdeğeri olup olmadığından emin değilim . –

0

Winapi'yi kullandığımdan beri bir süredir var, ancak the MSDN documentation'u aradım ve CreateConsole API işlevini bulamadım. Bu yüzden benim tahminim CreateConsole eski şeyler ve AttachConsole ile değiştirildi. Yani muhtemelen bir fark yoktur, ancak CreateConsole muhtemelen kullanımdan kaldırılmıştır.

5

CreateConsole adlı bir işlev olduğunu sanmıyorum, ancak AllocConsole var.

Bunun ne anlama geldiğini varsayarsak, buradaki farkın, ana işlem konsolunda yoksa AttachConsole(ATTACH_PARENT_PROCESS)'un return ERROR_INVALID_HANDLE olabileceğini düşünüyorum.

Komut istemine ve Başlat hem bu kodu çalıştırmayı deneyin -> Çalıştır:

komut isteminden çalıştırın
#include <windows.h> 
#pragma comment (lib, "user32.lib") 

int main() 
{ 
    BOOL b; 
    char msg[1024]; 

    b = FreeConsole(); 
    sprintf(msg, "%d", b); 
    MessageBox(NULL, msg, "FreeConsole", 0); 

    b = AttachConsole(ATTACH_PARENT_PROCESS); 
    sprintf(msg, "%d", b); 
    MessageBox(NULL, msg, "AttachConsole", 0); 

    return 0; 
} 

, bir 1 içeren iki mesaj kutusu görüntülenir, her iki çağrılar başarılı anlam. Başlat -> Çalıştır çalıştırıldığında, ilk kutu 1 içerir ve ikincisi 0 içerir, bu da yalnızca ilk aramanın başarılı olduğu anlamına gelir. İkincisi başarısız olur; çünkü explorer.exe (Başlat -> Çalıştır) tarafından başlatılan bir işlemin üst öğesi olan konsolda bulunmaz.

İlgili konular