উইন 32 অ্যাপে আমি কীভাবে ডিবাগ আউটপুট উইন্ডোতে মুদ্রণ করব?


99

আমি একটি উইন 32 প্রকল্প পেয়েছি যা আমি ভিজ্যুয়াল স্টুডিও 2005 এ লোড করেছি I'd আমি 'প্রিন্টফ' এবং 'কাউট <<' চেষ্টা করেছি কিন্তু আমার বার্তাগুলি একগুঁয়েভাবে ছাপিয়ে না থেকে যায়।

ভিজ্যুয়াল স্টুডিও আউটপুট উইন্ডোতে মুদ্রণের জন্য কি কোনও বিশেষ উপায় আছে?


11
দ্রষ্টব্য যে ভিজ্যুয়াল স্টুডিও আউটপুট উইন্ডোটি কনসোল নয়। তারা উভয়ই "এতে পাঠ্যযুক্ত উইন্ডো", তবে পর্দার আড়ালে আলাদা।
এমসাল্টার

তাহলে প্রত্যেক বার্তার সামনে উৎস CPP সম্পূর্ণ পাথ প্রদর্শন করা বনাম আউটপুট উইন্ডোতে অক্ষমতা, বিবেচনা কার্যসংক্রান্ত __ __ ফাইলের জন্য।
লরি স্টারন

উত্তর:


138

আপনি ব্যবহার করতে পারেন OutputDebugStringOutputDebugStringএমন একটি ম্যাক্রো যা আপনার বিল্ড বিকল্পগুলির উপর নির্ভর করে হয় মানচিত্রে OutputDebugStringA(char const*)বা ম্যাপ করে OutputDebugStringW(wchar_t const*)। পরবর্তী ক্ষেত্রে আপনাকে ফাংশনে বিস্তৃত অক্ষরের স্ট্রিং সরবরাহ করতে হবে। প্রশস্ত অক্ষর আক্ষরিক তৈরি করতে আপনি Lউপসর্গটি ব্যবহার করতে পারেন :

OutputDebugStringW(L"My output string.");

সাধারণত আপনি _Tএই জাতীয় ম্যাক্রোর সাথে একসাথে ম্যাক্রো সংস্করণ ব্যবহার করবেন :

OutputDebugString(_T("My output string."));

আপনি যদি ইউনিকোডের জন্য নির্মাণের জন্য কনফিগার করা থাকে তবে এটি এতে প্রসারিত হবে:

OutputDebugStringW(L"My output string.");

আপনি যদি ইউনিকোডের জন্য নির্মাণ না করে থাকেন তবে এটি এর মধ্যে প্রসারিত হবে:

OutputDebugStringA("My output string.");

4
পারফেক্ট! ধন্যবাদ যদিও সম্পূর্ণতার জন্য, এটি প্রমাণিত হয়েছে যে আমাকে এটি করতে হয়েছিল: আউটপুটডিবগস্ট্রিং (পাঠ্য ("হ্যালো কনসোল ওয়ার্ল্ড")); .. সম্ভবত ইউনিকোড-সম্পর্কিত বিল্ড বিকল্পের এক ধরণের কারণে।
izb

4
নোট করুন যে সিসিনটার্নালগুলি থেকে ডিবাগভিউ নেওয়া আপনার পক্ষে দরকারী হবে। এটি আপনাকে ওডিএস আউটপুটটি দেখতে দেয় এমনকি যদি ভিজুয়াল স্টুডিওটি বাক্সে চলমান (বা ইনস্টল করা) না হয়
pm100

4
@ সিডিটি: এটি এর ধরণের উপর নির্ভর করে myStr। এটা কি char*, wchar_t*বা LPTSTR? ধরে নেওয়া যাক এটা যে char*আপনি কেবল কল OutputDebugStringA(myStr)বা ব্যবহার OutputDebugStringWসঙ্গে wchar_t*এবং OutputDebugStringসঙ্গে LPTSTRযেমন আমার উত্তর ব্যাখ্যা।
মার্টিন লিভারেজ

4
@ সিসিডিটি: একটি ফাংশনকে একটি প্যারামিটার বলার চেয়ে সহজটি কী যে বার্তাটি আপনি আউটপুট দিতে চান? এটি কি এএনএসআই / ইউনিকোড জটিলতা? শুধু ব্যবহার OutputDebugStringহয় এবং আপনি যে অক্ষরগুলি ব্যবহার করুন অথবা নমনীয় "টি" ধরনের যা আপনি উভয় 8 এবং 16 বিট অক্ষর কম্পাইল করতে পারবেন সঙ্গে যেতে প্রস্থ মেলে উপযুক্ত প্রাক প্রসেসর প্রতীক নির্ধারণ করুন।
মার্টিন লিভারেজ

4
@ মোনাজালাল: কোন পর্দা তা আপনার মন্তব্য থেকে স্পষ্ট হয় না তাই আপনাকে নির্দিষ্ট পরামর্শ দেওয়া কিছুটা কঠিন। আপনি যদি আপনার প্রক্রিয়াটি ডিবাগ করেন তবে ডিবাগরের কাছে ডিবাগ আউটপুট প্রদর্শনের একটি উপায় থাকবে। আপনি যদি আপনার ডিবাগার হিসাবে ভিজ্যুয়াল স্টুডিও ব্যবহার করছেন তবে আউটপুট আউটপুট উইন্ডোতে প্রদর্শিত হবে। আসলে আউটপুট নির্বাচন করতে হয়েছে তা দেখতে ডিবাগ থেকে থেকে আউটপুট দেখান ড্রপডাউন। যদি কোনও কারণে আপনি কোনও ডিবাগারের বাইরে আপনার প্রক্রিয়া চালাচ্ছেন তবে আপনি সমস্ত প্রক্রিয়া থেকে ডিবাগ আউটপুট দেখতে ডিবাগভিউ ব্যবহার করতে পারেন ।
মার্টিন লিভারেজ

29

যদি প্রকল্পটি জিইউআই প্রকল্প হয় তবে কোনও কনসোল উপস্থিত হবে না। প্রকল্পটি কনসোলে পরিবর্তন করার জন্য আপনাকে প্রকল্পের বৈশিষ্ট্য প্যানেলে গিয়ে সেট করতে হবে:

  • " লিঙ্কার-> সিস্টেম-> সাবসিস্টেম " এ মান " কনসোল (/ সাবস্কিস্টেম: কনসোল) "
  • " সি / সি ++ -> প্রাকপ্রসেসর- > প্রিপ্রসেসর সংজ্ঞা " এ " _কনসোল " সংজ্ঞা যুক্ত করুন

এই সমাধানটি কেবল তখনই কাজ করে যদি আপনার ক্লাসিক " ইনট মেইন () " এন্ট্রি পয়েন্ট থাকে।

তবে আপনি যদি আমার ক্ষেত্রে (একটি ওপেনজিএল প্রকল্প) এর মতো হন তবে আপনার বৈশিষ্ট্যগুলি সম্পাদনা করার দরকার নেই, কারণ এটি আরও ভাল কাজ করে:

AllocConsole();
freopen("CONIN$", "r",stdin);
freopen("CONOUT$", "w",stdout);
freopen("CONOUT$", "w",stderr);

printf এবং cout যথারীতি কাজ করবে।

আপনি যদি উইন্ডোটি তৈরির আগে অলোকসনসোলকে কল করেন তবে কনসোলটি উইন্ডোটির পিছনে উপস্থিত হবে, আপনি যদি পরে কল করেন, এটি সামনে উপস্থিত হবে।

হালনাগাদ

freopenঅবহেলিত এবং অনিরাপদ হতে পারে। freopen_sপরিবর্তে ব্যবহার করুন:

FILE* fp;

AllocConsole();
freopen_s(&fp, "CONIN$", "r", stdin);
freopen_s(&fp, "CONOUT$", "w", stdout);
freopen_s(&fp, "CONOUT$", "w", stderr);

EDITBINCONSOLEএমনকি আপনি ব্যবহার WinMainনা করে এমনকি সাবসিস্টেম সেট করতে পারেন int main()
বেন ভয়েগট

4
@ জ্যাক ধন্যবাদ! অলোকসনসোল () দিয়ে শুরু হওয়া 4 টি লাইন দুর্দান্ত কাজ করেছে। প্লাস 1 তার জন্য। অন্য কিছুই কাজ করছে না, যদিও আমি / সাবস্কিস্টেম: কনসোল এবং / বা কনসোল ম্যাক্রোগুলি ব্যবহার করার আগে উইন 32 প্রকল্পে আগে দেখাতে কনসোল পেয়েছি। আজ সন্ধ্যায় ম্যাক্রোগুলি কেন কাজ করল না জানি না। কমন ল্যাঙ্গুয়েজ রানটাইম সাপোর্ট (/ সিএলআর) ব্যবহার করে কি এর কোনও যোগসূত্র থাকতে পারে ?
রাইডারবিল

12

realকনসোলে মুদ্রণের জন্য , আপনাকে লিঙ্কার পতাকা ব্যবহার করে এটি দৃশ্যমান করা দরকার /SUBSYSTEM:CONSOLE। অতিরিক্ত কনসোল উইন্ডো বিরক্তিকর, তবে ডিবাগিং উদ্দেশ্যে এটি অত্যন্ত মূল্যবান।

OutputDebugString ডিবাগারের অভ্যন্তরে চলতে গিয়ে ডিবাগার আউটপুট প্রিন্ট করে।


6
আপনি অলোকসনসোল () ব্যবহার করে আপনার নিজস্ব কনসোল বরাদ্দ করতে পারেন
বিলি ওনিল

5

_আরপিটি এন () এবং _আরপিটিএফ এন () রিপোর্টিংয়ের জন্য ভিসি ++ রানটাইম ম্যাক্রো ব্যবহার করার কথা বিবেচনা করুন

ডিবাগিংয়ের জন্য প্রিন্টফেট স্টেটমেন্টের ব্যবহার প্রতিস্থাপন করতে আপনি সিআরটিডিবিজিএইচ-তে সংজ্ঞায়িত _RPTn এবং _RPTFn ম্যাক্রো ব্যবহার করতে পারেন। যখন _DEBUG সংজ্ঞায়িত করা হয় না তখন এই ম্যাক্রোগুলি আপনার রিলিজ বিল্ডে স্বয়ংক্রিয়ভাবে অদৃশ্য হয়ে যায়, সুতরাং এগুলিকে #ifdefs এ সংযুক্ত করার দরকার নেই।

উদাহরণ ...

if (someVar > MAX_SOMEVAR) {
    _RPTF2(_CRT_WARN, "In NameOfThisFunc( )," 
         " someVar= %d, otherVar= %d\n", someVar, otherVar );
}

অথবা আপনি ভিসি ++ রানটাইম ফাংশন _CrtDbgReport, _CrtDbgReportW সরাসরি ব্যবহার করতে পারেন ।

_CrtDbgReport এবং _CrtDbgReportW তিনটি পৃথক গন্তব্যে ডিবাগ রিপোর্ট পাঠাতে পারে: একটি ডিবাগ রিপোর্ট ফাইল, একটি ডিবাগ মনিটর (ভিজ্যুয়াল স্টুডিও ডিবাগার), বা একটি ডিবাগ বার্তা উইন্ডো।

_CrtDbgReport এবং _CrtDbgReportW প্রিন্টফ বা ডাব্লুপ্রিন্টফ ফাংশন দ্বারা সংজ্ঞায়িত একই বিধিগুলি ব্যবহার করে বিন্যাসের স্ট্রিংয়ে আর্গুমেন্ট [n] যুক্তিগুলি স্থির করে ডিবাগ রিপোর্টের জন্য ব্যবহারকারী বার্তা তৈরি করে। এই ফাংশনগুলি পরে ডিবাগ রিপোর্ট উত্পন্ন করে এবং প্রতিবেদন টাইপের জন্য সংজ্ঞায়িত বর্তমান প্রতিবেদনের মোড এবং ফাইলের ভিত্তিতে গন্তব্য বা গন্তব্যগুলি নির্ধারণ করে। যখন কোনও ডিবাগ বার্তা উইন্ডোতে প্রতিবেদনটি প্রেরণ করা হয়, তখন ফাইলের নাম, লাইন নাম্বার এবং মডিউলনাম উইন্ডোটিতে প্রদর্শিত তথ্যের অন্তর্ভুক্ত থাকে।


এটি উত্তরে যুক্ত করা বা লক্ষ্য করা মূল্যবান যে _RPTF0ফর্ম্যাট স্ট্রিংয়ের পরে কোনও ভেরিয়েবল পাস করার আশা করা যায় না এমনটি ব্যবহার করা যেতে পারে। _RPTFNম্যাক্রো, অপরপক্ষে, প্রয়োজন ফরম্যাট স্ট্রিং নিম্নলিখিত অন্তত একটি যুক্তি।
amn

5

আপনি যদি দশমিক ভেরিয়েবল মুদ্রণ করতে চান:

wchar_t text_buffer[20] = { 0 }; //temporary buffer
swprintf(text_buffer, _countof(text_buffer), L"%d", your.variable); // convert
OutputDebugString(text_buffer); // print

%uস্বাক্ষরযুক্ত জন্য, রেফারেন্স%f অনুযায়ী ভাসা জন্য ।
লরি স্টার্ন

4

আপনার যদি এমন কোনও বিদ্যমান প্রোগ্রামের আউটপুট দেখতে হয় যা প্রিন্টফ ডাব্লু / ও কোড পরিবর্তন করে (বা সর্বনিম্ন পরিবর্তন সহ) ব্যবহার করে আপনি নীচে প্রিন্টফের পুনরায় সংজ্ঞা দিতে পারেন এবং সাধারণ শিরোনামে যোগ করতে পারেন (stdafx.h)।

int print_log(const char* format, ...)
{
    static char s_printf_buf[1024];
    va_list args;
    va_start(args, format);
    _vsnprintf(s_printf_buf, sizeof(s_printf_buf), format, args);
    va_end(args);
    OutputDebugStringA(s_printf_buf);
    return 0;
}

#define printf(format, ...) \
        print_log(format, __VA_ARGS__)

4
স্ট্যাটিক বাফারের কারণে সাবধান থাকুন, এই ফাংশনটি তদন্তকারী নয় এবং বিভিন্ন থ্রেড থেকে ব্যবহার করা যায়নি।
নিকাজো

2

আপনার উইন 32 প্রকল্পটি সম্ভবত একটি জিইউআই প্রকল্প, কোনও কনসোল প্রকল্প নয়। এটি এক্সিকিউটেবল হেডারে পার্থক্য সৃষ্টি করে। ফলস্বরূপ, আপনার জিইউআই প্রকল্পটি নিজস্ব উইন্ডো খোলার জন্য দায়বদ্ধ হবে। যদিও এটি কনসোল উইন্ডো হতে পারে। AllocConsole()এটি তৈরি করতে কল করুন এবং এতে লিখতে Win32 কনসোল ফাংশন ব্যবহার করুন।


2

আমি নিজেই এটি করার উপায় খুঁজছিলাম এবং একটি সহজ সমাধান বের করেছিলাম।

আমি ধরে নিচ্ছি যে আপনি ভিজ্যুয়াল স্টুডিওতে একটি ডিফল্ট উইন 32 প্রকল্প (উইন্ডোজ অ্যাপ্লিকেশন) শুরু করেছেন যা একটি "উইনমেইন" ফাংশন সরবরাহ করে। ডিফল্টরূপে, ভিজ্যুয়াল স্টুডিও "SUBSYSTEM: WINDOWS" এ এন্ট্রি পয়েন্ট সেট করে। আপনাকে প্রথমে এটিকে পরিবর্তন করতে হবে:

প্রকল্প -> বৈশিষ্ট্য -> লিংক -> সিস্টেম -> সাবসিস্টেম

এবং ড্রপ-ডাউন তালিকা থেকে "কনসোল (/ সাবস্কিস্ট: কনসোল)" নির্বাচন করুন।

এখন, প্রোগ্রামটি চলবে না, যেহেতু "উইনমাইন" ফাংশনের পরিবর্তে একটি "মূল" ফাংশন প্রয়োজন।

সুতরাং এখন আপনি আপনার মতো একটি "প্রধান" ফাংশন যুক্ত করতে পারেন সাধারণত সি ++ তে। এর পরে, জিইউআই প্রোগ্রামটি শুরু করতে, আপনি "উইনমাইন" ফাংশনটি "মূল" ফাংশনের ভিতরে থেকে কল করতে পারেন।

আপনার প্রোগ্রামের শুরুর অংশটি এখন এর মতো দেখতে হবে:

#include <iostream>

using namespace std;

// Main function for the console
int main(){

    // Calling the wWinMain function to start the GUI program
    // Parameters:
    // GetModuleHandle(NULL) - To get a handle to the current instance
    // NULL - Previous instance is not needed
    // NULL - Command line parameters are not needed
    // 1 - To show the window normally
    wWinMain(GetModuleHandle(NULL), NULL,NULL, 1); 

    system("pause");
    return 0;
}

// Function for entry into GUI program
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    // This will display "Hello World" in the console as soon as the GUI begins.
    cout << "Hello World" << endl;
.
.
.

আমার বাস্তবায়নের ফলাফল

এখন আপনি ডিবিগিং বা অন্যান্য উদ্দেশ্যে আপনার জিইউআই প্রোগ্রামের যে কোনও অংশে কনসোলে আউটপুট ফাংশন ব্যবহার করতে পারেন।


2

কনসোলে মুদ্রণের জন্য আপনি WritConsole পদ্ধতিটিও ব্যবহার করতে পারেন ।

AllocConsole();
LPSTR lpBuff = "Hello Win32 API";
DWORD dwSize = 0;
WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), lpBuff, lstrlen(lpBuff), &dwSize, NULL);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.