DLL zawierający metody dla WIN XP i wyżej - kompatybilność

0

Witam serdecznie.
Napisałem sobie zbiór natywnych funkcji w C do wykorzystania jako native w moim programie jawowym. Wszytko fajnie dopóki nie dostawiłem obsługi schowka i nie odpaliłem tego pod win xp.
Oczywiście schowek BY działał (bo nie działa sam program - nie odpala ale to za moment) bo wykorzystuje win32 (a wiec windows.h)
tylko gorzej zaczyna się dziać w przypadku np obsługi paska zadań z windows 7 (np ikona jako progressbar)
Wykorzystuje to interfejs ITaskbarList3, a jest pochodną ITaskbarList2 a ten pochodną ITaskbarList1. Według mnie, przez ten interfejs, który jest wprowadzony dopiero w Win7 aplikacja sie wywala pod Xp. Moje pytanie jest takie:

Czy istnieje jakikolwiek sposób, aby z wewnątrz dll sprawdzić sobie wersje systemu (dostępność interfejsu) i w zależności od tego sprawdzenia wykorzystać ten interfejs, bądź zwrócić sobie do javy - unsupported, czy coś w tym stylu
Bardzo proszę o pomoc

0

nie, nie należy sprawdzać wersji systemu, tylko czy można użyć konkretnej możliwości. w tym przypadku — czy uda się pozyskać interfejs ITaskbarList3. jeśli nie, to dostajesz jakiś tam wyjątek, czy nulla, czy błąd — wyłapujesz to i wtedy nie używasz tego interfejsu.

zrób po prostu normalną obsługę błędów.

0

hmmmm
generalnie, nie wiem w którym miejscu wywala błąd (puściłem distro koledze, jemu na xp sie wysypało a ja ciągle na w7 jestem). Zakładając, że w natywnym(a ja nie pisze już dawno w c,c++) w jaki sposób byś obsłużył ten kawałek kodu? Kiedy właściwie się pierwsza linia kodu wykonuje ?? DLLMain jest w innym cpp i nie wywołuje tego bloku (generalnie tylko pobiera do zmiennej globalnej uchwyt do samego siebie (dll)). Czy jest to wykonwane jeszcze przed mainem? (tak jak to chyba było ze zmiennymi globalnymi w c++). Czy mogę tą inicjalizacje komponentu wstawić w try/catch ? Może powinienem wstawić to do kolejnej natywki i wywołać to z javy przy próbie utworzenia obiektu. Dll byłby już załadowany do tego czasu, a jeżeli int nie byłby dostępny, to w programie wywaliłoby mi już tam javovy wyjątek coś w stylu UNSUPPORTED_OS_FEATURE :P

 CComPtr<ITaskbarList3> *taskList = new CComPtr<ITaskbarList3>();
HWND taskBarPrivateWindowHandle=NULL;
JNIEXPORT void JNICALL Java_swing_pl_choina_win7utils_TaskBarProgressBar_init
  (JNIEnv *env, jobject obj)
{	
	if(taskBarPrivateWindowHandle==NULL)
		taskBarPrivateWindowHandle=getHWND();
	CoInitializeEx(NULL,NULL);
	taskList->Release();
	taskList->CoCreateInstance(CLSID_TaskbarList);
}
0

A nie tak przypadkiem:

CComPtr<ITaskbarList3> taskList;

...


CComPtr<ITaskbarList> taskBar;

if(SUCCEEDED(taskBar.CoCreateInstance(CLSID_TaskbarList)))
{
	ITaskbarList3* ptbl = NULL; 
	
	if(FAILED(taskList.QueryInterface(&ptbl)))
	{
		jclass newExcCls;
		(*env)->ExceptionDescribe(env);
		(*env)->ExceptionClear(env);
		newExcCls = (*env)->FindClass(env, "java/lang/InstantiationException");
		if (newExcCls) 
		{
			(*env)->ThrowNew(env, newExcCls, "Fuck, couldn't get a ITaskBarList3 instance.");
		}
	}
	
	taskList.Attach(ptbl);
}

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