Momenteel ben ik bezig aan een (DLL) plugin voor LCDInfo, waarmee ik info uit MSN Messenger op mijn LCD kan toveren. Om info uit MSN te kunnen halen, heb je een COM-object nodig genaamd IMessenger. Normaal gesproken zou je dus zoiets doen:
En als ik dat letterlijk zo neerzet, werkt het ook prima. Het probleem is dat deze variabele iedere x milliseconden (laten we zeggen 500) wordt uitgelezen. En er worden nog meer variabelen op deze manier uitgelezen, dus iedere 500msec wordt er een keer of 10 een soortgelijke functie aangeroepen. Aangezien iedere CoCreateInstance() een nieuw msmsgs.exe proces spawnt, kun je op je vingers natellen dat dit gruwelijk veel resources en cpu tijd vreet (bij testen bleek dit ongeveer 50% van een 2.5ghz machine weg te vreten).
Mijn briljante (kuch) oplossing:
We maken een IMessenger *msn; en een bool loaded; in de class ipv lokaal in de functie in die class, roepen dan bij het initialiseren van de class de volgende code aan:
bij het opvragen van een variabele dit:
en bij het sluiten dit:
Zou moeten werken zou ik denken, maar nee dus. Ik krijg bij msn->get_mySigninName() de foutmelding (HRESULT) "CoInitialize has not been called". Als ik in de variabele-opvraagfunctie bovenaan CoInitialize(NULL); zet en onderaan CoUninitialize();, krijg ik de melding "The
application called an interface that was marshalled for a different thread."
Nu begrijp ik wel dat blijkbaar het initaliseren en deinitialiseren door een andere thread gedaan wordt dan het opvragen van de variabele, maar nu is de vraag hoe ik dit oplos. Ik heb al geprobeerd dmv een "loaded" boolean het aanmaken van het msn object in de opvraagfunctie te plaatsen, en dat gaat (uiteraard) de eerste keer goed, maar resulteert de eerstvolgende keer in de melding "Object is not connected to
server". Ik begin inmiddels een beetje radeloos te worden en heb echt geen idee hoe ik dit op zou moeten lossen... iemand enig idee? Alvast heel erg bedankt
C++:
1
2
3
4
5
6
7
8
| IMessenger *msn; BSTR name; CoInitialize(NULL); if (SUCCEEDED(CoCreateInstance(CLSID_Messenger, NULL, CLSCTX_LOCAL_SERVER, IID_IMessenger, reinterpret_cast<LPVOID *>(&msn)))) { if (SUCCEEDED(msn->get_MySigninName(&name))) { return name; } } |
En als ik dat letterlijk zo neerzet, werkt het ook prima. Het probleem is dat deze variabele iedere x milliseconden (laten we zeggen 500) wordt uitgelezen. En er worden nog meer variabelen op deze manier uitgelezen, dus iedere 500msec wordt er een keer of 10 een soortgelijke functie aangeroepen. Aangezien iedere CoCreateInstance() een nieuw msmsgs.exe proces spawnt, kun je op je vingers natellen dat dit gruwelijk veel resources en cpu tijd vreet (bij testen bleek dit ongeveer 50% van een 2.5ghz machine weg te vreten).
Mijn briljante (kuch) oplossing:
We maken een IMessenger *msn; en een bool loaded; in de class ipv lokaal in de functie in die class, roepen dan bij het initialiseren van de class de volgende code aan:
C++:
1
2
| CoInitialize(NULL); loaded = SUCCEEDED(CoCreateInstance(CLSID_Messenger, NULL, CLSCTX_LOCAL_SERVER, IID_IMessenger, reinterpret_cast<LPVOID *>(&msn))); |
bij het opvragen van een variabele dit:
C++:
1
2
3
4
5
6
| BSTR name; if (SUCCEEDED(msn->get_mySigninName(&name))) { return name; } else { return "failed"; } |
en bij het sluiten dit:
C++:
1
2
3
| msn->Release(); delete msn; CoUnitialize(); |
Zou moeten werken zou ik denken, maar nee dus. Ik krijg bij msn->get_mySigninName() de foutmelding (HRESULT) "CoInitialize has not been called". Als ik in de variabele-opvraagfunctie bovenaan CoInitialize(NULL); zet en onderaan CoUninitialize();, krijg ik de melding "The
application called an interface that was marshalled for a different thread."
Nu begrijp ik wel dat blijkbaar het initaliseren en deinitialiseren door een andere thread gedaan wordt dan het opvragen van de variabele, maar nu is de vraag hoe ik dit oplos. Ik heb al geprobeerd dmv een "loaded" boolean het aanmaken van het msn object in de opvraagfunctie te plaatsen, en dat gaat (uiteraard) de eerste keer goed, maar resulteert de eerstvolgende keer in de melding "Object is not connected to
server". Ik begin inmiddels een beetje radeloos te worden en heb echt geen idee hoe ik dit op zou moeten lossen... iemand enig idee? Alvast heel erg bedankt
[ Voor 9% gewijzigd door Verwijderd op 14-11-2005 22:41 . Reden: overal c++ code van gemaakt ]