2015-12-08 2 views
0

Я использую Visual Studio 2013 в Windows 10 машин и компиляции 64 бит выиграть 32 приложенияListView_GetItemText врезается

Я заселена контроль списка, как показано ниже:

// got the handle of the list control 
HWND m_list = GetDlgItem (hwnddialog, IDC_LIST); 
LVITEM x; 

//Inserted row items 
x.mask = LVIF_TEXT; x.iItem = 0; x.pszText = L"text"; x.state = 0; 
x.stateMask = 0, x.iImage =0; x.lParam = 0; x.iSubItem = 0; 
ListView_InsertItem(m_list, &x); 
// Added column texts ... 
ListView_SetItemText(m_list,0,1,"text details"); 

// etc... The list view shows fine. 
//-------------------------Now I am trying to read the text from listview ------ 
wchar_t tptr[512]; 
ListView_GetItemText(m_list , 0,0, tptr, 5); 

Независимо от значения я вхожу выше пункта, и пп и все, что я обеспечиваю как размер TPtr, (даже если я делаю это локальная или глобальная переменная) в programcrashes после выполнения вышеуказанной линии:

Необработанное исключение в 0x00007F FFC2CAA9AA (comctl32.dll) в sstwinpe64.exe: 0xC000041D: во время обратного вызова пользователя возникло необработанное исключение.

Необходимо разработать это в Win32, так как в WinPE теперь могут запускаться только программы Win32. Что не так в моей программе? Поблагодарив заранее, Basudeb

+0

Что-то странно в вашем коде - вы устанавливаете текст элемента в строку ANSI (простые текстовые данные «без префикса L»), но вы пытаетесь получить строку UNICODE (' wchar_t [] '). Кроме того, как 'ListView_SetItemText()', так и 'ListView_GetItemText()' работают с строками на основе TCHAR, фактические типы которых будут варьироваться в зависимости от макроса препроцессора 'UNICODE'. –

+1

Код выглядит суровым, но он не компилируется из-за несоответствия ANSI/Unicode. Поэтому я думаю, что вы опубликовали поддельный код. Пожалуйста, опубликуйте [mcve], чтобы все сомнения были удалены. Пожалуйста, никогда не спрашивайте о коде, который вы на самом деле не компилировали и не выполняли. –

ответ

0

Я не знаю структуру проекта, но мне кажется, что у вас есть смесь ANSI, Unicode и WCHAR:

x.pszText = L"text"; 
ListView_SetItemText(m_list,0,1,"text details"); 
wchar_t tptr[512]; 
+0

Прошу прощения за ошибку в отчетности, у меня есть код L перед кодом. Это не поддельный код, а только те тексты, которые мне пришлось изменить по причинам неприкосновенности частной жизни. Обратите внимание, что все другие макросы или сообщения в Listview работают отлично, за исключением случаев, когда я пытаюсь прочитать getitem или getitemtext. Я пробовал всевозможные исправления в течение трех дней, и только когда я потерпел неудачу, я прошу помощи. Любая помощь будет оценена. –

+0

@rezdm Что касается программирования Windows, связанный с Unicode == wchar. – andlabs

+0

@BasudebGupta, если вы можете воссоздать проблему с помощью программы с нуля, которая использует поддельные значения, это также будет приемлемо. Если вы найдете свою ошибку при написании такой программы, то это тоже нормально. – andlabs

0

Я получил странное решение проблема. Это бьет меня, но это одна из тех тайн. Посмотрите на фактические (не подделка) код тщательно:

wchar_t dsk[3200]; 
ListView_GetItemText(m_list,i,0,dsk,32); // Crashes as reported. 

Но я изменил его сейчас, как показано ниже: написал функцию:

BOOL GetItemText(HWND hlist,int nitem, int nsubitem, wchar_t * txt, int ln) 
{ 
ListView_GetItemText(hlist,nitem,nsubitem,txt,ln); 
return TRUE; 

} 

И изменил мой первоначальный вызов: GetItemText (m_list , я, 0, DSK, 32);

И вот! Он работает и не падает.

Любой может увидеть эту головоломку? Моя проблема решена, и я уйду. Но тайна будет звучать как тяжелый камень на заполненном выбоинами пути моего кодирования.

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