[vc++] Messenger friendlyname veranderen

Pagina: 1
Acties:

  • SiliconError
  • Registratie: Januari 2000
  • Laatst online: 29-10-2025

SiliconError

:(){ :|:& };:

Topicstarter
In navolging van dit topic: [rml][ VC++] FriendlyName in MSN messenger veranderen.[/rml] ben ik ook eens aan de slag gegaan met Winamp en MSN Messenger, alleen dit keer met als doel er een Winamp (v2) plugin van de maken.

Hierbij heb ik de standaard general-plugin code van Winamp.com gehaald en omgebouwd, dit werkt allemaal prima.
Het Messenger gedeelte wat Yarvieh in elkaar had geknutseld in het eerder genoemde topic werkt ook goed, behalve als Messenger niet gestart is (wat wel logisch is).

Om te voorkomen dat de boel dan fout loopt ben ik wat aan het prutsen geslagen met errorhandling (ontbrak in Yarvieh's code)... en het grote probleem is dat het nu x keer goed werkt, en dan toch ineens nog faalt.

Ik heb dit: http://www.codeproject.com/com/comintro.asp al eens rustig doorgelezen.

wat gaat er dus precies fout?
Iedere keer als ik mijn programmaatje (ik heb het maar ff losgetrokken van die plugin, anders hangt Winamp steeds) draai, terwijl Messenger NIET draait, start er een msmsgs.exe proces (COM Server ofzo :?)

Het gaat toch nog allemaal goed, totdat je probeert je FriendlyName aan te passen (oMsgrObj->Services->PrimaryService->FriendlyName=NewName; )
Dat zorgt voor een lelijke error, en daarna moet je (als ik alles goed begrepen heb in die COM handleiding) toch nog dat MsgrObject releasen.

Ik denk dus dat dit releasen (eens in de zo veel keer, dat is dus het wazige) niet goed gaat, omdat msmsgs.exe blijft draaien, ipv dat 'ie weer afsluit.
Het programmaatje sluit wel zonder errors, alleen de volgende keer dat je het start, loopt 'ie tegen een hangende msmsgr.exe aan, maakt er nóg een bij, en loopt zelf ook vast.


Daar zit ik dan: HELP! Wie kan mij iets nieuws leren hier 8)7


Ohja, hier is de code (van Yarvieh uit dat ene topic, en dan een beetje aangepast/verprutst, en wat ingekort om hier te kunnen posten :))
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#import "d:\program files\messenger\msmsgs.exe" no_namespace
#include <stdio.h>

int main(void)
{
    // Initalize COM 
    CoInitialize(NULL);


    // Get Instance of Messenger.MsgrObject
    IMsgrObject2Ptr oMsgrObj = NULL;
    HRESULT HR=oMsgrObj.CreateInstance("Messenger.MsgrObject");


    if (SUCCEEDED(HR)) {

        // [winamp code weggeknipt, die kan iedereen halen @ winamp.com]
        char NewName[4096];
        sprintf(NewName,"I am playing : %s", "TEST");

        try 
        {
            // Tell msn to use it
            oMsgrObj->Services->PrimaryService->FriendlyName=NewName;

        }
        catch(_com_error er) 
        {
            // Hier had k zelf een error message die er nu niet toe doet :)
        }

    }

    // Release the interface pointer
    oMsgrObj.Release();

    // Uninitalize COM and exit app
    CoUninitialize();

    return 0;
}

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 02:09
Ik kan me onmogelijk voorstellen dat je bij gebruik van een COM service stringwaarden moet/kunt instellen door middel van pointer assignment. Ik neem dus aan dat er een andere manier (een methode op je Service object ofzo?) moet zijn om op een veilige manier een nieuwe naam toe te kennen.

Verwijderd

Soultaker schreef op 18 augustus 2002 @ 17:26:
Ik kan me onmogelijk voorstellen dat je bij gebruik van een COM service stringwaarden moet/kunt instellen door middel van pointer assignment.
Natuurlijk kan dat wel, VC kan hele mooie com-wrappers genereren die die soort trukjes toe laten, stukken beter dan iedere keer je HRESULTS moeten cheken imho.

  • SiliconError
  • Registratie: Januari 2000
  • Laatst online: 29-10-2025

SiliconError

:(){ :|:& };:

Topicstarter
Hmm, om maar ff terug te komen op mijn vraag: weet iemand waarom *soms* die msmsgr.exe blijft hangen, terwijl het meestal gewoon goed gaat?

Verwijderd

Netter in wellicht als messenger niet draait ook 'm ook niet op te starten als je winamp plug start (ik bedoel gebruiker zal'm niet voor niets uit hebben gezet ik zou het zelf tamelijk irri vinden als meneer winamp bepaald dat ik msn maar aan moest gaan doen) vervang die CreateInstance es door 'n GetActiveObject?

  • SiliconError
  • Registratie: Januari 2000
  • Laatst online: 29-10-2025

SiliconError

:(){ :|:& };:

Topicstarter
MSN gaat ook niet echt aan, niet dat je het hele venster + trayicon enzo ziet, maar er wordt iig een nieuwe msmsgr.exe gestart (op de achtergrond).

Na, anywayz, ik zal ff gaan kijken of ik wat ga snappen van GetActiveObject :)

  • SiliconError
  • Registratie: Januari 2000
  • Laatst online: 29-10-2025

SiliconError

:(){ :|:& };:

Topicstarter
OK, dat GetActiveObject doet nog niet veel. Ik neem aan dat bij GetActiveObject je niet zoiets kunt doen als bij CreateInstance (dus ipv al die ID's opgeven, gewoon "Messenger.MsgrObject" er in zetten)? Dan heb je dus al die ID's nodig (kheb er al een hele zooi geprobeerd, maar het lukt niet echt met die dingen, laat maar ff zitten dus...)

Bovendien wil ik voor mijn plugin nog ooit kunnen checken wie er ingelogd is op MSN (emailadres ofzo).
Ik dus zoeken, en in die automagisch gegenereerde msmsgs.tli file vond ik dit:
IMsgrUser::PutFriendlyName, IMsgrUser::GetFriendlyName en IMsgrUser::GetEmailAddress
Er moet dus ergens een manier zijn om die Naam en het adres op te vragen, en om een nieuwe naam op te geven.

Ik wilde dat dus gaan proberen, maar als ik ipv MsgrObject dus MsgrUser invul in de code, dan werkt de CreateInstance sowieso niet meer (altijd failed)...
Kan iemand mij uitleggen waarom, ik kom niet echt verder zo :)

Enne, Yarvieh... waarom heb je in je stuk code eigenlijk gekozen voor MsgrObject en dit: oMsgrObj->Services->PrimaryService->FriendlyName
Ik snap namelijk niet hoe je aan het Services->PrimaryService->FriendlyName gedeelte komt... ik kan het ook nergens vinden in die .tli of .tlh files (waar heb jij het dan gevonden)

Verwijderd

Silicon Error schreef op 19 augustus 2002 @ 18:49:
Enne, Yarvieh... waarom heb je in je stuk code eigenlijk gekozen voor MsgrObject en dit: oMsgrObj->Services->PrimaryService->FriendlyName
Ik snap namelijk niet hoe je aan het Services->PrimaryService->FriendlyName gedeelte komt... ik kan het ook nergens vinden in die .tli of .tlh files (waar heb jij het dan gevonden)
Vrijsimpel? oMsgrObj is een insantie van 'n object wat de IMsgrObject2 interface implementeerd welke op zijn beurd inherit van IMsgrObject welke je de Services(IMsgrServices) interface geeft. die heeft weer'n reference naar de primaryservice(IMsgrServices) en die heeft 'n FriendlyName property.. je kan het allemaal terug vinden dmv oleview of door zelf in de .tlh file wat rond te neuzen (ik prefereer oleview omdat je daar vrij clean de idl code hebt zonder allerlei wrapper geneuzel er omheen die je in de tlh wel hebt)

  • SiliconError
  • Registratie: Januari 2000
  • Laatst online: 29-10-2025

SiliconError

:(){ :|:& };:

Topicstarter
Na wat rondklikken in de OLE/COM Object Viewer snap ik inderdaad hoe jij het inelkaar hebt gestoken.

Toch blijf ik maar hier tegen aanlopen: CreateInstance("Messenger.MsgrObject");
Hoewel dit misschien een mooiere en simpelere manier is, doen alle manuals enzo het met de CLSID's en IID's in CoCreateInstance.
Ik heb tijden zitten neuzen in die Viewer, en ik kan van bijv de IMsgrServices interface het IID vinden, maar CoCreateInstance heeft dus ook nog een CLSID nodig... die kan ik nergens vinden...

Het vreemde is trouwens dat de officiele Messenger API doc's andere ID's aangeven dan de Object Viewer, voor dezelfde Interfaces
(bijv de IMessengerServices Interface: de viewer zegt 659ECAD8-A5C0-11D2-A440-00C04F795683, de docs zeggen 2E50547B-A8AA-4f60-B57E-1F414711007B... maar de methods die erbij staan zijn hetzelfde :?)

Verwijderd

Silicon Error schreef op 20 augustus 2002 @ 22:13:
Ik heb tijden zitten neuzen in die Viewer, en ik kan van bijv de IMsgrServices interface het IID vinden, maar CoCreateInstance heeft dus ook nog een CLSID nodig... die kan ik nergens vinden...
CoCreateInstance maakt alleen dingen die in je typelib viewer bij coclass staan. De interfaces die beschreven staan zijn alleen definities de coclass implementeerd een of meerdere interfaces (meestal meer aangezien ze alleen IUnknown implementeren niet zo usefull is) en die kan je instancieren dmv CoCreateInstance
Het vreemde is trouwens dat de officiele Messenger API doc's andere ID's aangeven dan de Object Viewer, voor dezelfde Interfaces
(bijv de IMessengerServices Interface: de viewer zegt 659ECAD8-A5C0-11D2-A440-00C04F795683, de docs zeggen 2E50547B-A8AA-4f60-B57E-1F414711007B... maar de methods die erbij staan zijn hetzelfde :?)
Idd das vreemd..kan er ook nie meer van maken :Y)

  • SiliconError
  • Registratie: Januari 2000
  • Laatst online: 29-10-2025

SiliconError

:(){ :|:& };:

Topicstarter
Yo, ben ik weer met een nieuwe vraag :)

Die Viewer, als je m eenmaal doorhebt ;), is verrekte handig.
Jouw stukje code had ik dus ook binnen de kortste keren omgewerkt tot een met CoCreateInstance (dat wilde ik graag om te oefenen :))

code:
1
2
3
4
5
6
7
8
9
10
static const GUID CLSID_MsgrObject =
{ 0xF3A614DC, 0xABE0, 0x11D2, { 0xA4, 0x41, 0x00, 0xC0, 0x4F, 0x79, 0x56, 0x83 } };

static const GUID IID_IMsgrObject2 =
{ 0x218CB455, 0x20B6, 0x11D2, { 0x8E, 0x17, 0x00, 0x00, 0xF8, 0x03, 0xA4, 0x46 } };

...

IMsgrObject2* oMsgrObj = NULL;
HRESULT HR=CoCreateInstance (CLSID_MsgrObject, NULL, CLSCTX_INPROC_SERVER, IID_IMsgrObject2, (void**) &oMsgrObj );


Daarna ging ik verder met de hint 'gebruik GetActiveObject'. Dat leek me nu ook niet zo lastig meer.
Ik zoeken op internet, en in de MSDN prut lezen, en ik kwam hierop:

code:
1
2
IUnknown* pMsgrObject = NULL;
HRESULT HR=GetActiveObject (CLSID_MsgrObject, NULL, &pMsgrObject);


Ik dacht, nou, dat zou moeten werken (ik neem aan dat je, als dit zou werken, erna met QueryInterface de IMsgrObject2 interface moet opvragen).
Maargoed, GetActiveObject ging niet op deze manier :'(

Enig idee wat ik fout doe? Ik dacht, misschien draait Messenger niet, maar na 100x checken of dat groene kreng onderin m'n tray stond, was ik ervan overtuigd dat het goed moest zijn.

Verwijderd

Ik heb es in de running object table gekeken (Irotview) op het moment dat ik msn start. het ding registreerd zich niet daar dus met GetactiveObject ga je 'm dan idd ook niet vinden ('t was ook maar een ideetje hoor) Let wel op als aangezien je nu zelf je objecten maakt dmv CoCreateInstance en QueryInterface ben je ook *VERPLICHT* Release/AddRef (addref word al gedaan door QI maar als je die pointer zelf daarna gaat kopieren moet je 'm zelf addref'en!!) aan te roepen om de refcounter bij te houden...

  • SiliconError
  • Registratie: Januari 2000
  • Laatst online: 29-10-2025

SiliconError

:(){ :|:& };:

Topicstarter
Yay, ik kom toch nog maar even posten dat ik het crashprobleem heb opgelost (als MSN niet draaide en je deed 2 snelle nickname updates achter elkaar dan bleef msmsgr.exe hangen of er kwamen er 2 of meer).

Omdat GetActiveObject niet werkte ben ik gaan zoeken naar een andere manier om te bepalen of MSN draait...

Dit is het geworden (dom voorbeeldje):
code:
1
2
3
4
5
6
HWND hwndMSN = FindWindow("MSBLGeneric", NULL);
if (hwndMSN) { 
    MessageBox(NULL, "MSN UP", "UP", MB_OK);
} else {
    MessageBox(NULL, "MSN DOWN", "DOWN", MB_OK);
}
Verder is m'n plugin dus ook zo goed als klaar en hier te downloaden voor de liefhebber ;)
http://silicon.xs4all.nl/public/gen_msn.zip
Pagina: 1