[C++/MFC]Copy implementatie geeft CoInitialize error

Pagina: 1
Acties:

  • pinkwin|IA
  • Registratie: Juni 2003
  • Laatst online: 23-04-2004
Op het internet zijn verschillende tutorials te vinden over hoe copy paste geimplementeerd kan worden in een applicatie. Aan de hand daarvan heb ik dat ook in mijn programma gezet, maar bij het testen ervan krijg ik iedere keer weer in een popup schermpje deze error:

CoInitialize has not been called.

dit is de geimplementeerde code vanuit de tutorial:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
void CMainFrame::OnEditCopy() {
    COleDataSource* pSource = new COleDataSource();
    CSharedFile sf(GMEM_MOVEABLE|GMEM_DDESHARE|GMEM_ZEROINIT);
    CString  text = _T("Test");

    sf.Write(text, text.GetLength()); 
    HGLOBAL hMem = sf.Detach();
    if (!hMem) return;

    pSource->CacheGlobalData(CF_TEXT, hMem);
    pSource->SetClipboard();
}


bij het zoeken naar een oplossing heb ik ontdekt dat dit probleem overal voor kan komen waar OLE en/of COM-objecten gebruikt worden. Hier en daar wordt de functie CoInitialize(NULL) aangeroepen, maar dat helpt bij mij niet. Het maakt niet uit waar ik CoInitialize(NULL) neer zet, iedere keer weer komt deze foutmelding.

Kan iemand anders mij misschien hiermee helpen?

Ik zeg maar zo, ik zeg maar nix. dan zeg ik al veel te veel.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Voor een thread OLE/COM gebruikt moet er in die thread CoInitialize aangeroepen worden.

Professionele website nodig?


  • pinkwin|IA
  • Registratie: Juni 2003
  • Laatst online: 23-04-2004
curry684 schreef op 08 januari 2004 @ 11:20:
Voor een thread OLE/COM gebruikt moet er in die thread CoInitialize aangeroepen worden.
dan zou dit toch moeten werken:
C++:
1
2
3
4
5
6
void CMainFrame::OnEditCopy() {
    CoInitialize(NULL);
    COleDataSource* pSource = new COleDataSource();
    CSharedFile sf(GMEM_MOVEABLE|GMEM_DDESHARE|GMEM_ZEROINIT);
    ....
}

??
dat doet het niet..

Ik zeg maar zo, ik zeg maar nix. dan zeg ik al veel te veel.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Maar wie gooit die popup waar op?

For the record: "it takes two to tango, and it takes two to IPC"

Professionele website nodig?


  • pinkwin|IA
  • Registratie: Juni 2003
  • Laatst online: 23-04-2004
sorry, de popup komt bij deze regel:
pSource->SetClipboard();

en wordt gegenereerd door de functie
LRESULT AFXAPI AfxCallWndProc(CWnd* pWnd, HWND hWnd, UINT nMsg, WPARAM wParam = 0, LPARAM lParam = 0)

bij het stukje van CATCH_ALL(e)...
het is dus niet een popup die ik aanmaak.

Ik zeg maar zo, ik zeg maar nix. dan zeg ik al veel te veel.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Check eens middels 'GetCurrentThreadId' of OnEditCopy en die WndProc wel binnen dezelfde thread uitgevoerd worden.

Professionele website nodig?


  • pinkwin|IA
  • Registratie: Juni 2003
  • Laatst online: 23-04-2004
in OnEditCopy heb ik threadId 916, maar in de WndProc kan ik op geen enkele wijze ontdekken welke thread het is.
C++:
1
2
3
CString tmp;
tmp.Format("%d", GetCurrentThreadId());
AfxMessageBox(tmp);

deze code zet ik in de functie, maar hij doet er helemaal niets mee.

Ik zeg maar zo, ik zeg maar nix. dan zeg ik al veel te veel.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Een messagebox is niet de meest tactische functie om voor iedere message uit te voeren :D

Maak gewoon een logfile aan?

Professionele website nodig?


  • pinkwin|IA
  • Registratie: Juni 2003
  • Laatst online: 23-04-2004
curry684 schreef op 08 januari 2004 @ 13:46:
Een messagebox is niet de meest tactische functie om voor iedere message uit te voeren :D

Maak gewoon een logfile aan?
'gewoon' is voor mij niet gewoon...

ik heb nu een trace geprobeerd, en daarmee zie ik ook niets..

DWORD dwTest = GetCurrentThreadId();
TRACE1("dwtest: %d .\n", dwTest);

kan je me een voorbeeld geven hoe ik een logfile aanmaak met het threadid erin?

[ Voor 4% gewijzigd door pinkwin|IA op 08-01-2004 14:12 . Reden: traceid = threadid ]

Ik zeg maar zo, ik zeg maar nix. dan zeg ik al veel te veel.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Uhm fopen, fprintf en fclose doen wonderen ;)

Maar heb je al gedebugged? Zo'n wonderlijk breakpoint waarmee je door de code stept en in je IDE volautomatisch de current threads plus hun ID's ziet?

Professionele website nodig?


  • pinkwin|IA
  • Registratie: Juni 2003
  • Laatst online: 23-04-2004
ik wist niet dat threadId ook in het debug scherm stond, maar na even zoeken heb ik m gevonden. bij zowel OnEditCopy() als de AfxCallWndProc heeft hij threadId 916. daar ligt het dus niet aan..

Ik zeg maar zo, ik zeg maar nix. dan zeg ik al veel te veel.


  • pinkwin|IA
  • Registratie: Juni 2003
  • Laatst online: 23-04-2004
Het is opgelost.
voor mensen met hetzelfde probleem, zet OleInitialize(NULL) in je code:

C++:
1
2
3
CMainFrame::CMainFrame(){
    OleInitialize(NULL);
}

curry684, toch hardstikke bedankt voor je hulp!

Ik zeg maar zo, ik zeg maar nix. dan zeg ik al veel te veel.

Pagina: 1