verknüpfung erstellen...


  • Mod

    CoCreateInstance gehört in ein MFC Programm nur, wenn man wirlich weiß was man macht ;).

    Innerhalb der MFC sollte man nur AfxOleInit() verwenden... sicher es gibt seltene Ausnahmen...



  • Martin Richter schrieb:

    CoCreateInstance gehört in ein MFC Programm nur, wenn man wirlich weiß was man macht ;).

    Innerhalb der MFC sollte man nur AfxOleInit() verwenden... sicher es gibt seltene Ausnahmen...

    Ich bezweifle, dass man COM-Objekte in der MFC mit AfxOleInit() erstellen kann. 😉


  • Mod

    sri schrieb:

    Ich bezweifle, dass man COM-Objekte in der MFC mit AfxOleInit() erstellen kann. 😉

    Und warum tust Du das? Weißt Du wirklich von was Du redest?

    AfxOleInit ist ein per Thread Wrapper für ::OleInitialize(NULL); (siehe link unten).
    Zudem sorgt AfxOleInit dafür, dass bei Beenden des Threads automatisch AfxOleTerm aufgerufen wird.

    ::OleInitialize(NULL) ist ein Wrapper für den Aufruf von CoInitializeEx im STA Kontext:
    Siehe MSDN
    http://msdn.microsoft.com/en-us/library/ms690134(VS.85).aspx

    OleInitialize calls CoInitializeEx internally to initialize the COM library on the current apartment. Because OLE operations are not thread-safe, OleInitialize specifies the concurrency model as single-thread apartment.

    Die MFC benutzt und verlangt genau diesen STA Modus. Sofern man also nicht wirklich weiß was man mit CoInitializeEx macht, sollte man es in der MFC vermeiden.

    Siehe auch MSDN Doku zu AfxOleInit:
    http://msdn.microsoft.com/de-de/library/e91aseaz(VS.80).aspx

    MFC applications must be initialized as single threaded apartment (STA). If you call CoInitializeEx in your InitInstance override, specify COINIT_APARTMENTTHREADED (rather than COINIT_MULTITHREADED). For more information, see PRB: MFC Application Stops Responding When You Initialize the Application as a Multithreaded Apartment (828643) at http://support.microsoft.com/default.aspx?scid=kb;en-us;828643.



  • Du hast in deinem Beitrag vorher CoCreateInstance und OleInitialize vermischt.


  • Mod

    Nein Ich habe CoInitialize(Ex) mit CoCreateInstance verwechselt...

    Sorry! Argh... Manchmal sollte man etwas mehr nachdenken oder genauer lesen...
    Entschuldigung!



  • Danke für die erhellenden Links zu MFC und MTA. 🙂

    CoInitializeEx habe ich bisher noch nie verwendet. Wenn ein Arbeitsthread COM benötigt, dann verwende ich immer CoInitialize am Anfang bzw. Ende der Thread-Funktion. OleInitialize initialisiert ja noch einiges mehr, was aber in der Regel im Arbeitsthread nie gebraucht wird.


  • Mod

    Noch mal sorry für die Konfusion!

    Performance und speichermässig macht dies keinen Unterschied. Das Nette ist, dass man sich nicht um das zweigerechte Auflösen mit CoUninitialize kümmern muss. AfxOleInit macht alles richtig für die MFC.

    Damit der Vorteil im Komponentenbau: Benötige ich in meinem Thread COM. Rufe ich eben AfxOleInit auf. Um das Uninit kümmert sich eben irgendwann der MFC Thread selber.



  • ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH !!!!!!!!!!!!!!!

    ok Leute...
    nochmal nach MultiByteToWideChar gegooelt und ich habe was pasendes gefunden und angepasst, bin der glücklichste Mensch der Welt 🙂

    const char *pszPfadLink = "C:\\notepad.lnk"; // !!!!! die Verknüpfung
    	const char *pszLinkTo = "C:\\x.exe"; // !!!!! Der Pfad
    const char *pszArguments = 0;
    const char *pszIcon = 0;
    
    long res;
    res = CoInitialize(NULL);
    
    IShellLink *pSHL;
    res = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void **)&pSHL);
    if(FAILED(res))
    {
    pSHL->Release();
    
    }
    
    pSHL->SetPath(pszLinkTo);
    pSHL->SetArguments(pszArguments);
    pSHL->SetIconLocation(pszIcon, 1);
    IPersistFile *pPF;
    res = pSHL->QueryInterface(IID_IPersistFile, (void **)&pPF);
    if(FAILED(res))
    {
    pSHL->Release();
    
    }
    
    WCHAR usWide[MAX_PATH];
    MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, pszPfadLink, -1, usWide, MAX_PATH);
    
    res = pPF->Save(usWide,true);
    if(FAILED(res))
    {
    pSHL->Release();
    pPF->Release();
    
    }
    

  • Mod

    Und warum verwendest Du nicht CA2W oder CT2W?



  • @Martin Richer

    äähh was verwenden? 🙂


  • Mod

    CA2W oder CT2W?
    SIehe unter anderem auch:
    http://msdn.microsoft.com/en-us/library/xsyac802(VS.80).aspx


Anmelden zum Antworten