2013-09-05 5 views
1

У меня возникли трудности с использованием функции MessageBox с переменнымимассив MessageBox символов C++

У меня есть

int main(int argc, char* argv[]) 
{ 
    char* filename = argv[0]; 
    DWORD length = strlen(filename); 

    MessageBox(0, TEXT("filename text"), TEXT("length text"), 0); // Works 
} 

Но я хочу выходные переменные файла и длины, как:

MessageBox(0, filename, length, 0); -- compiler error 

Функция MessageBox имеет синтаксис:

int WINAPI MessageBox(
    _In_opt_ HWND hWnd, 
    _In_opt_ LPCTSTR lpText, 
    _In_opt_ LPCTSTR lpCaption, 
    _In_  UINT uType 
); 

Я попытался с помощью

MessageBox(0, (LPCWSTR)filename, (LPCWSTR)length, 0); 

, но выход в какой-то иероглифами.

+1

Третий аргумент 'lpCaption' - это строка, и вы передаете ему' int' ('length'). –

ответ

0

Переменная length не является строкой, и могут использоваться только строки. Это не поможет вам применить его к char*, так как значение length будет принято как указатель на строку, которая приведет к неопределенному поведению.

Для C++ вы можете использовать, например. std::to_string для преобразования не-строковые значения в строки, как

MessageBox(0, filename, std::to_string(length).c_str(), 0); 

Обратите внимание, что вы должны использовать функцию c_str, чтобы получить char*.

Если у вас нет std::to_string, то вы можете использовать, например. std::istringstream вместо:

std::istringstream is; 
is << length; 
MessageBox(0, filename, is.str().c_str(), 0); 

Если вы хотите более старого стиля решения C, то есть snprintf (или _snprintf в Visual Studio):

char length_string[20]; 
_snprintf(length_string, sizeof(length_string), "%ld", length); 
MessageBox(0, filename, length_string, 0); 
+0

да Я понимаю, что вы, ребята, имеете в виду, но проблема в том, что для типа файла необходим тип LPCTSTR, но если я использую имя файла MessageBox (0, (LPCTSTR), (LPCTSTR) filename, 0); он показывает коробку с некими иероглифами вместо имени файла. – Winten

+0

@Winten Все зависит от того, установлен ли макрос '_UNICODE' или нет. В этом случае, похоже, в этом случае вы действительно должны использовать ['_tmain'] (http://msdn.microsoft.com/en-us/library/6wd819wh.aspx) и использовать' TCHAR' и ' LPCTSTR' везде. Кроме того, если '_UNICODE' определен, вы хотите вместо этого использовать' std :: iwstringstream', 'std :: to_wstring' или' _snwprintf'. –

+0

Использование 'MessageBoxA' получит версию, которая принимает узкие символы –

-1

С C++ win32 проект в VS2015 полукокса массив отображает в MessageBox с этим кодом. Включить заголовок atlstr.h

// open a file in read mode. 
ifstream myInfile; 

myInfile.open("C:\\Users\\Desktop\\CodeOnDesktop\\myTrialMessageBox.txt"); 

if (myInfile.fail()) 
{ 
    MessageBox(NULL, 
     L"We have an error trying to open the file myTrialMessageBox.txt", 
     L"Opening a file.", 
     MB_ICONERROR); 
} 

char data[200]; 

// Read the data from the file and display it. 
//infile >> data; // Only gets the first word. 

myInfile.getline(data, 100); 

//To use CString, include the atlstr.h header. 
// Cast array called data to a CString to enable use as MessageBox parameter. 

CString cdata = (CString)data; 

// or CString cdata = CString(_T("A string")); 

MessageBox(NULL, 
    cdata, 
    L"Opening a file.", 
    MB_ICONERROR); 

// close the opened file. 
myInfile.close(); 
+0

Не затрагивает вопрос о том, как показать целое число в окне сообщений –

Смежные вопросы