Miejsce wykonywania kodu- raz działa raz nie

0

Witam! Spotkało mnie ciekawe, ale problematyczne zdarzenie. Otóż kod programu poniżej zamieszczony pomiędzy gwiazdkami, nie działa a kod robiący to samo w pętli switch sprawuje się wyśmienicie. Musi więc być jakaś róznica miedzy dwoma sposobami. Jaka?


#include <windows.h>
#include <stdio.h>
#include "resource.h"
long int ilosc_temp,diff;
HMODULE hKBHookDLL;

typedef void (*LPSetKBHook)(void);
LPSetKBHook SetKBHook = NULL;

typedef unsigned long (*LPGetKeyStrokes)(void);
LPGetKeyStrokes GetKeyStrokes = NULL;
typedef unsigned long (*LPGetKeyCounter)(void);
LPGetKeyCounter GetKeyCounter = NULL;

typedef void (*LPKillKBHook)(void);
LPKillKBHook KillKBHook = NULL;

BOOL LoadHookDLL()
{
 hKBHookDLL = LoadLibrary("def.dll");
 if (!hKBHookDLL) return(0);

 SetKBHook = (LPSetKBHook)GetProcAddress(hKBHookDLL, "SetKBHook");
 if (!SetKBHook) return(0);

 GetKeyStrokes = (LPGetKeyStrokes)GetProcAddress(hKBHookDLL, "GetKeyStrokes");
 if (!GetKeyStrokes) return(0);
  GetKeyCounter = (LPGetKeyCounter)GetProcAddress(hKBHookDLL, "GetKeyCounter");
 if (!GetKeyCounter) return(0);

 KillKBHook = (LPKillKBHook)GetProcAddress(hKBHookDLL, "KillKBHook");
 if (!KillKBHook) return(0);



 SetKBHook();

 return(1);
}

void FreeHookDLL()
{
 KillKBHook();
 FreeLibrary(hKBHookDLL);
}

BOOL CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
 long int ilosc_zn;
 switch(msg)
 {
  case WM_INITDIALOG:
   if (!LoadHookDLL()) EndDialog(hDlg, 0);
   SetTimer(hDlg, 0, 3, NULL);
  break;
  case WM_COMMAND:
   switch(LOWORD(wParam))
   {
    case IDC_OK: EndDialog(hDlg, 0); break;
   }
  break;
  case WM_TIMER:
   switch(wParam)
   {
    case 0:
     HWND hTmp = GetDlgItem(hDlg, IDC_EDIT1);
     char str[50];

     sprintf(str, "%d", GetKeyStrokes());

	 
	 ilosc_zn=GetKeyCounter();
	if(ilosc_zn!=ilosc_temp)
	{
	
	diff=ilosc_zn-ilosc_temp;
	ilosc_temp=ilosc_zn;
	} else diff=0;
     SetWindowText(hTmp, str);
    break;
   }
  break;
  case WM_DESTROY:
   FreeHookDLL();
  break;
 }
 return(0);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
	
	//*******************************
	if (LoadHookDLL())            //działa
	{
		while(!GetKeyCounter())      //zwraca cały czas 0 więc program w tym miejscu się zapętla
		{	};	
	}


	//************************************
 DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, (DLGPROC)DlgProc);
 return(1);
}
0

Niestety, sadzac po kodzie - wszystko zalezy od tego, jak jest napisana biblitoeka "def.dll" z ktorej probujesz skorzystac.
Mozliwe, ze funkcja GetKeyCount po porstu korzysta z jakos "aktualnego/aktywnego okna", np. oczekuje ze bedzie wywolywana gdzies-z-wewnatrz wndproca/obslugi wiadomosci itp.. w WinMain zadne okno do ktorego sie mozna podczepic jeszcze nie istnieje, po "DialogBox" - zadne okno juz nie istnieje. I stad, funkcja ta moglaby dzialac tylko w tamtym miejscu - obsludze wiadomosci.. Ale to zgadywanka. Musisz wziac owa def.dll i ja obejrzec. Masz jej okumentacje? kod?

1 użytkowników online, w tym zalogowanych: 0, gości: 1