PDAclub.pl - Forum użytkowników technologii mobilnych

Windows Mobile (Classic, Professional, Standard), Windows Phone 6.x oraz 7/8.x/10 => Oprogramowanie PPC => Dla programistów => Wątek zaczęty przez: lemkat w Wrzesień 23, 2005, 22:58:54

Tytuł: 1400 invalid handle
Wiadomość wysłana przez: lemkat w Wrzesień 23, 2005, 22:58:54
Witam
Nie wiem czemu ale kod ktory dzialal wlasnie przestal:

Powoluje do zycia DialogBox z menu:

DialogBox( hInst , (LPCTSTR)IDD_ADD_PART, hWnd , (DLGPROC)AddPartProc );

w jej funkcji zwrotnej po wcisnieciu klawiszu OK chce odczytac tekst z kontrolki Edit Box:
LRESULT CALLBACK AddPartProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam )
// ....
case WM_INITDIALOG:
shidi.dwMask = SHIDIM_FLAGS;
shidi.dwFlags = SHIDIF_SIPDOWN | SHIDIF_SIZEDLGFULLSCREEN;
shidi.hDlg = hDlg;
SHInitDialog(&shidi);
return TRUE;
case WM_COMMAND:
wmId    = LOWORD(wParam);
wmEvent = HIWORD(wParam);
switch( wmId )
{
case BID_ADD_PART:
// symbol czesci
iCount = GetDlgItemText( hDlg , EID_PART , pBuffer , 10 );
                if( iCount == 0 )
                         {
                         iCount = GetLastError();
                         }
i tu jest problem "hDlg" jest uchwytem DialogBox mimo to w momencie wywolania funkcji odczytu tekstu mam kod 1440 ( invalid handle ), gdzie moze byc blad ???


Jakkolwiek bym nie probowal nie moge uzyskac uchwyt tego onkna:
FindWindow etc...

Jeszcze jedna dosc istotna rzecz:
w msdn znalazlem ze funkcja jest zdeklarowana w Afxwin.h dopuki jej nie podlacze progs sie kompiluje i wszystko jest ok, jak ja podlacze progs mi sie wywala:
 D:\programowanie\WindowsCE\SerwisCzesci\SerwisCzesci.cpp(303) : error C2065: 'GetDlgItemText' : undeclared identifier
musi sie grysc z jakas inna biblioteka ;/
Tytuł: 1400 invalid handle
Wiadomość wysłana przez: MacBirdie w Wrzesień 24, 2005, 10:40:34
Nieee, afxwin.h to akurat nagłówek z biblioteki MFC, nie dołączaj go do swojego projektu, skoro działasz w czystym Win32 (korzystając "po cichu" z winuser.h).

Dziwna sytuacja z tym uchwytem.
Sprawdź czy w momencie tworzenia dialogu uchwyt okna jest taki sam jak otrzymywany przez jego procedurę.
Tytuł: 1400 invalid handle
Wiadomość wysłana przez: lemkat w Wrzesień 24, 2005, 12:47:44
Witam


Zadeklarowalem globalna zmienna HWND hAdd;

w momencie tworzenia okna robie tak:

case WM_INITDIALOG:
...
shidi.hDlg = hDlg;
SHInitDialog(&shidi);
hAdd = hDlg;
return TRUE;
// ...
// i potem sprawdzenie czy uchwyt jest ten sam
case WM_COMMAND:
wmId    = LOWORD(wParam);
wmEvent = HIWORD(lParam);
switch( wmId )
  {
  case BID_ADD_PART:
  // symbol czesci
  if( hAdd == hDlg )
   {
   MessageBox( NULL , TEXT("Ten sam") , TEXT("Ok") , MB_OK );
   }
i wyglada na to ze uchwyt jest ten sam ;(
Tytuł: 1400 invalid handle
Wiadomość wysłana przez: MacBirdie w Wrzesień 24, 2005, 13:10:14
A co będzie jeśli zamiast
(LPCTSTR)IDD_ADD_PART
zrobisz MAKEINTRESOURCE(IDD_ADD_PART)
Jest to już nieco desperacka poprawka, bo raczej nic nie wniesie, no ale... ;)

Może ewentualnie wyzeruj zawartość SHINITDLGINFO przed ustawianiem jego parametrów? To też tak na wszelki wypadek, bo chyba zazwyczaj nie trzeba tego robić.
Tytuł: 1400 invalid handle
Wiadomość wysłana przez: lemkat w Wrzesień 24, 2005, 13:20:42
niestety nic nie wnosi do sprawy, co najsmieszniejsze ten kod wczesniej dzialal, czy moze to miec cos wspolnego z ustawieniami dialog box ????
(typ, wyglad etc...)

[Dodano: 2005-09-24 13:50:06]
wiec zapytam tak ;( czy jest jakis inny sposob uzyskania tekstu z kontrolki Edit Box ( ciezko sie przyzwyczaic do tego vc , ech )
Tytuł: 1400 invalid handle
Wiadomość wysłana przez: MacBirdie w Wrzesień 24, 2005, 14:19:34
Póki EID_PART nadal istnieje, nie powinno być problemu.
A pBuffer gdzie trzymasz i w jakiej postaci?

Wyciągnąć tekstu raczej inaczej się nie da, metoda z której korzystasz po prostu MUSI działać.
Jest to na pewno kontrolka tekstowa? Na pewno widoczna? Aktywna?
Tytuł: 1400 invalid handle
Wiadomość wysłana przez: lemkat w Wrzesień 24, 2005, 14:32:14
Deklaracja bufora na text z kontrolki:
LPTSTR pBuffer;
Kontrolka to Edit Box

Jest aktywna skoro do niej wpisuje tekst ;/

Jeszcze jedno, w kursie ( jakims tam ) wyczytalem ze mozna dodac do kontrolki zmienne ( variables ) postepuje jak pisze czyli na formie prawym daje class wizard i tam chce dla mojej kontrolki dodac zmienna ale vc sie burzy ze nie ma okreslonego typu zmiennej dla tej kontrolki:
"there is no data types for this kind of control"

Chyba miales racje z ta nauka programowania w vc po bcb, praktycznie od zera ;/
Tytuł: 1400 invalid handle
Wiadomość wysłana przez: MacBirdie w Wrzesień 24, 2005, 14:54:48
pBuffer może zmień na TCHAR?

Niestety tak jest w przypadku czystego Win32 - zaczynasz od zera, masa do nauczenia się. Nawet gdybyś chciał sobie to ułatwić WTLem (a polecam), to i tak musisz wiedzieć jak to wszystko działa.

Borlandowski VCL rzeczywiście został dość ładnie zrobiony i zorganizowany, dlatego też pewnie główny projektant tej biblioteki trafił do Microsoftu by stworzyć C# i inne dopiero nadchodzące nowości. ;)
Tytuł: 1400 invalid handle
Wiadomość wysłana przez: lemkat w Wrzesień 25, 2005, 00:32:46
Problem rozwiazany, nie wiem czemu walil invalid handle ale problem polegal na buforze przechwytujacym dane:

tak nie dziala:
LPTSTR pBuffor;
GetDlgItemText( hDlg ,IDC_ADD_SYMBOL, pBuffor, 10 );

a tak wszystko jest ok:
TCHAR Buffor[ 12 ]
GetDlgItemText( hDlg ,IDC_ADD_SYMBOL, (LPTSTR)Buffor, 10 );

cos sie musialo walic w pamieci bo ze dwa razy pierwszy sposob dzialal

Pozdrawiam
Tytuł: 1400 invalid handle
Wiadomość wysłana przez: MacBirdie w Wrzesień 25, 2005, 04:04:31
A widzisz, sugerowałem to już :P
Cytat: MacBirdie
pBuffer może zmień na TCHAR?
Tytuł: 1400 invalid handle
Wiadomość wysłana przez: PiKNew w Wrzesień 25, 2005, 11:40:28
błąd był nie w typie, ale w braku alokacji pamięci (przypadek, że wcześniej tamten kod działał, bo prawdopodobnie losowa wartość wskaźnika po deklaracji wzkazywała na "mało istotne dane", które były w tym przypadku nadpisywane)...

LPTSTR == TCHAR *
Tytuł: 1400 invalid handle
Wiadomość wysłana przez: MacBirdie w Wrzesień 25, 2005, 12:52:29
Fakt, zbyt oczywiste to było, by wskaźnik kierował na jakąś zaalokowaną pamięć. B)