2010-01-26 48 views
41

Tôi có ứng dụng Qt và khi tôi chạy ứng dụng này, có một bảng điều khiển mở phía sau ứng dụng đó. Trong phát triển nó là tốt đẹp bởi vì tôi thấy kết quả đầu ra gỡ lỗi trên bàn điều khiển, nhưng khi tôi muốn cung cấp cho thực thi này cho khách hàng nên không có cửa sổ giao diện điều khiển. Tôi làm cách nào để ẩn nó?Ẩn bảng điều khiển của Ứng dụng Windows

(Tôi đang sử dụng Visual Studio 2008)

+0

Cách tốt nhất là để thực hiện một dự án QT và sử dụng QVTKWidget . – Orochi

Trả lời

42

Có vẻ như cấu hình trình liên kết của bạn không chính xác. Nhấp chuột phải vào dự án, thuộc tính, liên kết, hệ thống, thiết lập hệ thống con. Đảm bảo "Windows" được chọn, không phải "Bảng điều khiển".

Và, thay đổi chính() thành WinMain().

+1

khi tôi chọn Windows thay vì Console, tôi gặp lỗi liên kết – ufukgun

+1

có sự khác biệt nào giữa main() và WinMain() không? – ufukgun

+4

Bạn cũng có thể thiết lập điểm vào của dự án thành tiêu chuẩn 'main()' trong Properties -> Linker -> Advanced -> Entry point –

3

tôi sẽ đề nghị để kiểm tra sự hiện diện của các dòng sau trong file .PRO của bạn:

CONFIG += console 

Nếu bạn có thể tìm thấy nó, loại bỏ nó! Nó sẽ khắc phục vấn đề của bạn!

Hy vọng điều đó sẽ hữu ích!

+0

nhưng studio trực quan không sử dụng tệp .PRO. nó chỉ xuất/nhập tệp này .. – ufukgun

+0

Dự án Visual Studio thực tế được tạo bằng cách sử dụng các tham số cấu hình trong tệp dự án QMake, vì vậy điều này rất có thể là nguyên nhân. – Veeti

+0

Erm, trong thuộc tính VCProj, có thể bằng cách vào Links Edition, System và cuối cùng là Subsystem ... Thử đặt giá trị "Windows (/ SUBSYSTEM: WINDOWS)" ... Tôi không chắc bạn có thể làm như vậy tho ... –

4

Có thể là lựa chọn tốt hơn sẽ được không chỉ đơn giản là loại bỏ (như Andy M gợi ý) nhưng chỉnh sửa * .pro tập thêm một cái gì đó giống như

CONFIG(debug, debug|release) { 
    CONFIG *= console 
} 
else { 
    CONFIG -= console 
} 

Trong debug bạn có thể thấy giao diện điều khiển cửa sổ nhưng không phải trong phiên bản. Tôi thích nó. =)

9

tôi sử dụng phương pháp đó và nó làm việc

HWND hwnd = GetConsoleWindow(); 
ShowWindow(hwnd, 0); 
+4

Nếu bạn khởi động chương trình từ dòng lệnh, dòng lệnh sẽ biến mất. 'FreeConsole' không có vấn đề đó. – nwp

7

giải pháp Tiếp theo;)

Env: WixXP x64, msvs 2008, Qt v4.5.3

  1. Set dự án cài đặt/Cấu hình thuộc tính/Trình liên kết/Hệ thống/Hệ thống con = Windows (/ SUBSYSTEM: WINDOWS)

    Nhưng đối với x64 có linke r lỗi: LNK2019: biểu tượng bên ngoài chưa được giải quyết _WinMain tham chiếu trong chức năng _WinMainCRTStartup" Để tránh nó

  2. Thay thế đoạn mã sau:

    int main(int argc, char *argv[]) 
    { 
        QApplication app(argc, argv); 
        // your code* 
    } 
    

    bởi

    int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, char*, int nShowCmd) 
    { 
        int argc = 0; 
        QApplication app(argc, 0); 
    } 
    

Nó hoạt động tốt cho cả hai nền tảng Win32 và x64.

+0

Phương pháp này sẽ ngăn chương trình lấy thông số từ dòng lệnh. Ý tưởng rất, rất tệ. -1.Nếu bạn muốn làm điều đó một cách chính xác, tokenize chuỗi bạn nhận được vây tham số thứ ba của WinMain. Và có, có rất nhiều chương trình Windows giải thích các tham số dòng lệnh. Ví dụ menu ngữ cảnh "In" trong Windows Explorer bắt đầu một chương trình với các tham số dòng lệnh. – datenwolf

+0

datenwolf, Chúng vẫn ở đó bằng cách sử dụng các macro __argv và __argc (ít nhất là trong MSVC) hoặc hàm GetCommandLine/CommandLineToArgv winapi. – Cray

82

Trong các tùy chọn liên kết dự án xây dựng thiết

/SUBSYSTEM:windows 
/ENTRY:mainCRTStartup 

Hoặc sử dụng như sau #pragma trong file nguồn với int main(...)

#pragma comment(linker, "/SUBSYSTEM:windows /ENTRY:mainCRTStartup") 
+2

Imo câu trả lời tốt nhất và điểm-điểm, xử lý cả phần hệ thống con và phần điểm nhập khác nhau. Gợi ý unicode nhỏ: nếu bạn biên dịch với unicode và có wmain như trái ngược với chính, bình luận nên được "/ ENTRY: wmainCRTStartup". – Cray

+0

@Cray: WCHAR không phải là Unicode. Nếu bạn đang sử dụng Unicode thực với các thư viện thích hợp như ICU, mainCRTStrartup bình thường hoạt động tốt. – datenwolf

+0

Chắc chắn, tuy nhiên tôi đã nói về tùy chọn trình biên dịch (ví dụ, "biên dịch với unicode"). Họ đang thực sự gọi nó là "Sử dụng bộ ký tự Unicode". – Cray

14

Bạn có thể thoát khỏi giao diện điều khiển bằng cách gọi:

FreeConsole(); 
+0

Bạn đã xem nó, vì vậy đã quá muộn. – Liviu

0

For thos e của bạn chỉnh sửa .vcxproj trực tiếp, bạn muốn thêm một SubSystem với giá trị Windows để bạn LinkItemDefinitionGroup như sau:

<ItemDefinitionGroup> 
    <Link> 
    <SubSystem>Windows</SubSystem> 
    </Link> 
</ItemDefinitionGroup> 
+0

@ vô danh-downvoter Tò mò tại sao điều này có một downvote? Bất cứ điều gì tôi có thể cải thiện? – Dogmatixed

0

Go to: Projects --> Run và bỏ chọn hộp kiểm Run in terminal

3

Nếu bạn sử dụng Properties- > Linker-> System-> Hệ thống con | Windows

Và nhận lỗi liên kết.

Bạn có thể nhìn vào Linker-> Advanced-> Entry Point

và thiết lập giá trị cho tên của Funktion "chính" của bạn.

Đó là điểm nhập cảnh của bạn trở thành, chính, nếu chức năng chính của bạn là "chính".

-2

này đã làm việc cho tôi:

CONFIG(debug, debug|release) { 
    CONFIG *= console 
} 
else { 
    CONFIG -= console 
} 

tôi cần thiết để chạy một exe để theo dõi một tập tin sử dụng QFileSystemWatcher vì vậy tôi sử dụng này:

CONFIG -= console 
Các vấn đề liên quan