/* these functions do : replace each %%, %1, %2 into %, p1, p2. %1 must appear only once in the message string, otherwise internal buffer will overflow. ( %2 must also so ) */ ttstr TVPFormatMessage(const tjs_char *msg, const ttstr & p1) { tjs_char *p; tjs_char * buf = new tjs_char[TJS_strlen(msg) + p1.GetLen() + 1]; p = buf; for(;*msg;msg++,p++) { if(*msg == TJS_W('%')) { if(msg[1] == TJS_W('%')) { // %% *p = TJS_W('%'); msg++; continue; } else if(msg[1] == TJS_W('1')) { // %1 TJS_strcpy(p, p1.c_str()); p += p1.GetLen(); p--; msg++; continue; } } *p = *msg; } *p = 0; ttstr ret(buf); delete [] buf; return ret; }
//--------------------------------------------------------------------------- void TVPClipboardSetText(const ttstr & text) { if( ::OpenClipboard(0) ) { HGLOBAL ansihandle = NULL; HGLOBAL unicodehandle = NULL; try { // store ANSI string std::string ansistr = text.AsNarrowStdString(); int ansistrlen = (ansistr.length() + 1)*sizeof(char); ansihandle = ::GlobalAlloc(GMEM_DDESHARE | GMEM_MOVEABLE, ansistrlen); if( !ansihandle ) TVPThrowExceptionMessage( TVPFaildClipboardCopy ); char *mem = (char*)::GlobalLock(ansihandle); if(mem) strncpy_s(mem, ansistrlen, ansistr.c_str(),ansistrlen); ::GlobalUnlock(ansihandle); ::SetClipboardData( CF_TEXT, ansihandle ); ansihandle = NULL; // store UNICODE string unicodehandle = ::GlobalAlloc(GMEM_DDESHARE | GMEM_MOVEABLE, (text.GetLen() + 1) * sizeof(tjs_char)); if(!unicodehandle) TVPThrowExceptionMessage( TVPFaildClipboardCopy );; tjs_char *unimem = (tjs_char*)::GlobalLock(unicodehandle); if(unimem) TJS_strcpy(unimem, text.c_str()); ::GlobalUnlock(unicodehandle); ::SetClipboardData( CF_UNICODETEXT, unicodehandle ); unicodehandle = NULL; } catch(...) { if(ansihandle) ::GlobalFree(ansihandle); if(unicodehandle) ::GlobalFree(unicodehandle); ::CloseClipboard(); throw; } ::CloseClipboard(); } }