verknüpfung erstellen...
-
#include shortcut.h <- gibt es nicht
-
Martin Richter schrieb:
In dem zweiten Artikel ist der Header mit in dem ZIP!
http://www.codeproject.com/KB/shell/CShortcut.aspxDadrin kannst du dir den Source holen und dadrin gibts dann logischerweise Shortcut.cpp und Shortcut.h !
-
thx all...
ok,demo runtergeladen und ziemlich alles abgeschnitten.
Wird die Funktion aufgerufen,wird ein icon erstellt.
Jetzt hab ich das Problem,wenn ich den schnipsel in mein Projekt einfüge,bringt er 2 Fehler.IShellLink* psl; CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*) &psl); IPersistFile* ppf; psl->SetPath("c:\\Dokumente und Einstellungen\\tomtom\\Eigene Dateien\\Visual Studio Projects\\demo_II\\Debug\\Shortcut Demo.exe"); psl->SetDescription("sExePath"); //Die beschrei psl->QueryInterface(IID_IPersistFile, (LPVOID *)&ppf); WORD wsz[MAX_PATH]; MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, "C:\\Dokumente und Einstellungen\\tomtom\\Desktop\\ddd.lnk", -1, wsz, MAX_PATH); psl->SetIconLocation("C:\\WINDOWS\\system32\\shell32.dll", 1); // Pfad /INDEX !!!! ppf->Save(wsz, TRUE); ppf->Release(); psl->Release();
error C2664: 'MultiByteToWideChar' : cannot convert parameter 5 from 'WORD [260]' to 'LPWSTR' 'IPersistFile::Save' : cannot convert parameter 1 from 'WORD [260]' to 'LPCOLESTR'
-
WCHAR wsz[MAX_PATH];
-
eingefügt und erbringt keine Fehler.
WEnn ich auf den Knpf drücke kommt.
Fatal Error.psl->SetPath("c:\\Dokumente und Einstellungen\\tomtom\\Eigene Dateien\\Visual Studio Projects\\demo_II\\Debug\\Shortcut Demo.exe");
-
Den Debugger kennst Du?
-
vc++ 2003 studio
-
Das hat auch schon einen. Also Schritt für Schritt durchgehen, Fehlercodes abfragen und auf NULL-Zeiger prüfen. Ich glaube nicht, dass Dir das jemand abnehmen wird.
-
das komische ist,der schnipsel geht im dem Demo, los nicht in meinem Projekt, ich scheck das mal.
-
Kleiner Tipp: Rückgabewert von CoCreateInstance prüfen. Der sollte eigentlich alles aussagen.
-
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.
-
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).aspxOleInitialize 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).aspxMFC 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.
-
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.
-
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 Weltconst 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(); }
-
Und warum verwendest Du nicht CA2W oder CT2W?
-
@Martin Richer
äähh was verwenden?