olemisc.cpp 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359
  1. // This is a part of the Microsoft Foundation Classes C++ library.
  2. // Copyright (C) 1992-1998 Microsoft Corporation
  3. // All rights reserved.
  4. //
  5. // This source code is only intended as a supplement to the
  6. // Microsoft Foundation Classes Reference and related
  7. // electronic documentation provided with the library.
  8. // See these sources for detailed information regarding the
  9. // Microsoft Foundation Classes product.
  10. #include "stdafx.h"
  11. #ifdef AFX_OLE_SEG
  12. #pragma code_seg(AFX_OLE_SEG)
  13. #endif
  14. #ifdef _DEBUG
  15. #undef THIS_FILE
  16. static char THIS_FILE[] = __FILE__;
  17. #endif
  18. #define new DEBUG_NEW
  19. /////////////////////////////////////////////////////////////////////////////
  20. // Debug diagnostics for SCODEs
  21. #ifdef _DEBUG
  22. LPCTSTR AFXAPI AfxGetScodeString(SCODE sc)
  23. {
  24. struct SCODE_ENTRY
  25. {
  26. SCODE sc;
  27. LPCTSTR lpszName;
  28. };
  29. #define MAKE_SCODE_ENTRY(sc) { sc, _T(#sc) }
  30. static const SCODE_ENTRY scNameTable[] =
  31. {
  32. MAKE_SCODE_ENTRY(S_OK),
  33. MAKE_SCODE_ENTRY(S_FALSE),
  34. MAKE_SCODE_ENTRY(CACHE_S_FORMATETC_NOTSUPPORTED),
  35. MAKE_SCODE_ENTRY(CACHE_S_SAMECACHE),
  36. MAKE_SCODE_ENTRY(CACHE_S_SOMECACHES_NOTUPDATED),
  37. MAKE_SCODE_ENTRY(CONVERT10_S_NO_PRESENTATION),
  38. MAKE_SCODE_ENTRY(DATA_S_SAMEFORMATETC),
  39. MAKE_SCODE_ENTRY(DRAGDROP_S_CANCEL),
  40. MAKE_SCODE_ENTRY(DRAGDROP_S_DROP),
  41. MAKE_SCODE_ENTRY(DRAGDROP_S_USEDEFAULTCURSORS),
  42. MAKE_SCODE_ENTRY(INPLACE_S_TRUNCATED),
  43. MAKE_SCODE_ENTRY(MK_S_HIM),
  44. MAKE_SCODE_ENTRY(MK_S_ME),
  45. MAKE_SCODE_ENTRY(MK_S_MONIKERALREADYREGISTERED),
  46. MAKE_SCODE_ENTRY(MK_S_REDUCED_TO_SELF),
  47. MAKE_SCODE_ENTRY(MK_S_US),
  48. MAKE_SCODE_ENTRY(OLE_S_MAC_CLIPFORMAT),
  49. MAKE_SCODE_ENTRY(OLE_S_STATIC),
  50. MAKE_SCODE_ENTRY(OLE_S_USEREG),
  51. MAKE_SCODE_ENTRY(OLEOBJ_S_CANNOT_DOVERB_NOW),
  52. MAKE_SCODE_ENTRY(OLEOBJ_S_INVALIDHWND),
  53. MAKE_SCODE_ENTRY(OLEOBJ_S_INVALIDVERB),
  54. MAKE_SCODE_ENTRY(OLEOBJ_S_LAST),
  55. MAKE_SCODE_ENTRY(STG_S_CONVERTED),
  56. MAKE_SCODE_ENTRY(VIEW_S_ALREADY_FROZEN),
  57. MAKE_SCODE_ENTRY(E_UNEXPECTED),
  58. MAKE_SCODE_ENTRY(E_NOTIMPL),
  59. MAKE_SCODE_ENTRY(E_OUTOFMEMORY),
  60. MAKE_SCODE_ENTRY(E_INVALIDARG),
  61. MAKE_SCODE_ENTRY(E_NOINTERFACE),
  62. MAKE_SCODE_ENTRY(E_POINTER),
  63. MAKE_SCODE_ENTRY(E_HANDLE),
  64. MAKE_SCODE_ENTRY(E_ABORT),
  65. MAKE_SCODE_ENTRY(E_FAIL),
  66. MAKE_SCODE_ENTRY(E_ACCESSDENIED),
  67. MAKE_SCODE_ENTRY(CACHE_E_NOCACHE_UPDATED),
  68. MAKE_SCODE_ENTRY(CLASS_E_CLASSNOTAVAILABLE),
  69. MAKE_SCODE_ENTRY(CLASS_E_NOAGGREGATION),
  70. MAKE_SCODE_ENTRY(CLIPBRD_E_BAD_DATA),
  71. MAKE_SCODE_ENTRY(CLIPBRD_E_CANT_CLOSE),
  72. MAKE_SCODE_ENTRY(CLIPBRD_E_CANT_EMPTY),
  73. MAKE_SCODE_ENTRY(CLIPBRD_E_CANT_OPEN),
  74. MAKE_SCODE_ENTRY(CLIPBRD_E_CANT_SET),
  75. MAKE_SCODE_ENTRY(CO_E_ALREADYINITIALIZED),
  76. MAKE_SCODE_ENTRY(CO_E_APPDIDNTREG),
  77. MAKE_SCODE_ENTRY(CO_E_APPNOTFOUND),
  78. MAKE_SCODE_ENTRY(CO_E_APPSINGLEUSE),
  79. MAKE_SCODE_ENTRY(CO_E_BAD_PATH),
  80. MAKE_SCODE_ENTRY(CO_E_CANTDETERMINECLASS),
  81. MAKE_SCODE_ENTRY(CO_E_CLASS_CREATE_FAILED),
  82. MAKE_SCODE_ENTRY(CO_E_CLASSSTRING),
  83. MAKE_SCODE_ENTRY(CO_E_DLLNOTFOUND),
  84. MAKE_SCODE_ENTRY(CO_E_ERRORINAPP),
  85. MAKE_SCODE_ENTRY(CO_E_ERRORINDLL),
  86. MAKE_SCODE_ENTRY(CO_E_IIDSTRING),
  87. MAKE_SCODE_ENTRY(CO_E_NOTINITIALIZED),
  88. MAKE_SCODE_ENTRY(CO_E_OBJISREG),
  89. MAKE_SCODE_ENTRY(CO_E_OBJNOTCONNECTED),
  90. MAKE_SCODE_ENTRY(CO_E_OBJNOTREG),
  91. MAKE_SCODE_ENTRY(CO_E_OBJSRV_RPC_FAILURE),
  92. MAKE_SCODE_ENTRY(CO_E_SCM_ERROR),
  93. MAKE_SCODE_ENTRY(CO_E_SCM_RPC_FAILURE),
  94. MAKE_SCODE_ENTRY(CO_E_SERVER_EXEC_FAILURE),
  95. MAKE_SCODE_ENTRY(CO_E_SERVER_STOPPING),
  96. MAKE_SCODE_ENTRY(CO_E_WRONGOSFORAPP),
  97. MAKE_SCODE_ENTRY(CONVERT10_E_OLESTREAM_BITMAP_TO_DIB),
  98. MAKE_SCODE_ENTRY(CONVERT10_E_OLESTREAM_FMT),
  99. MAKE_SCODE_ENTRY(CONVERT10_E_OLESTREAM_GET),
  100. MAKE_SCODE_ENTRY(CONVERT10_E_OLESTREAM_PUT),
  101. MAKE_SCODE_ENTRY(CONVERT10_E_STG_DIB_TO_BITMAP),
  102. MAKE_SCODE_ENTRY(CONVERT10_E_STG_FMT),
  103. MAKE_SCODE_ENTRY(CONVERT10_E_STG_NO_STD_STREAM),
  104. MAKE_SCODE_ENTRY(DISP_E_ARRAYISLOCKED),
  105. MAKE_SCODE_ENTRY(DISP_E_BADCALLEE),
  106. MAKE_SCODE_ENTRY(DISP_E_BADINDEX),
  107. MAKE_SCODE_ENTRY(DISP_E_BADPARAMCOUNT),
  108. MAKE_SCODE_ENTRY(DISP_E_BADVARTYPE),
  109. MAKE_SCODE_ENTRY(DISP_E_EXCEPTION),
  110. MAKE_SCODE_ENTRY(DISP_E_MEMBERNOTFOUND),
  111. MAKE_SCODE_ENTRY(DISP_E_NONAMEDARGS),
  112. MAKE_SCODE_ENTRY(DISP_E_NOTACOLLECTION),
  113. MAKE_SCODE_ENTRY(DISP_E_OVERFLOW),
  114. MAKE_SCODE_ENTRY(DISP_E_PARAMNOTFOUND),
  115. MAKE_SCODE_ENTRY(DISP_E_PARAMNOTOPTIONAL),
  116. MAKE_SCODE_ENTRY(DISP_E_TYPEMISMATCH),
  117. MAKE_SCODE_ENTRY(DISP_E_UNKNOWNINTERFACE),
  118. MAKE_SCODE_ENTRY(DISP_E_UNKNOWNLCID),
  119. MAKE_SCODE_ENTRY(DISP_E_UNKNOWNNAME),
  120. MAKE_SCODE_ENTRY(DRAGDROP_E_ALREADYREGISTERED),
  121. MAKE_SCODE_ENTRY(DRAGDROP_E_INVALIDHWND),
  122. MAKE_SCODE_ENTRY(DRAGDROP_E_NOTREGISTERED),
  123. MAKE_SCODE_ENTRY(DV_E_CLIPFORMAT),
  124. MAKE_SCODE_ENTRY(DV_E_DVASPECT),
  125. MAKE_SCODE_ENTRY(DV_E_DVTARGETDEVICE),
  126. MAKE_SCODE_ENTRY(DV_E_DVTARGETDEVICE_SIZE),
  127. MAKE_SCODE_ENTRY(DV_E_FORMATETC),
  128. MAKE_SCODE_ENTRY(DV_E_LINDEX),
  129. MAKE_SCODE_ENTRY(DV_E_NOIVIEWOBJECT),
  130. MAKE_SCODE_ENTRY(DV_E_STATDATA),
  131. MAKE_SCODE_ENTRY(DV_E_STGMEDIUM),
  132. MAKE_SCODE_ENTRY(DV_E_TYMED),
  133. MAKE_SCODE_ENTRY(INPLACE_E_NOTOOLSPACE),
  134. MAKE_SCODE_ENTRY(INPLACE_E_NOTUNDOABLE),
  135. MAKE_SCODE_ENTRY(MEM_E_INVALID_LINK),
  136. MAKE_SCODE_ENTRY(MEM_E_INVALID_ROOT),
  137. MAKE_SCODE_ENTRY(MEM_E_INVALID_SIZE),
  138. MAKE_SCODE_ENTRY(MK_E_CANTOPENFILE),
  139. MAKE_SCODE_ENTRY(MK_E_CONNECTMANUALLY),
  140. MAKE_SCODE_ENTRY(MK_E_ENUMERATION_FAILED),
  141. MAKE_SCODE_ENTRY(MK_E_EXCEEDEDDEADLINE),
  142. MAKE_SCODE_ENTRY(MK_E_INTERMEDIATEINTERFACENOTSUPPORTED),
  143. MAKE_SCODE_ENTRY(MK_E_INVALIDEXTENSION),
  144. MAKE_SCODE_ENTRY(MK_E_MUSTBOTHERUSER),
  145. MAKE_SCODE_ENTRY(MK_E_NEEDGENERIC),
  146. MAKE_SCODE_ENTRY(MK_E_NO_NORMALIZED),
  147. MAKE_SCODE_ENTRY(MK_E_NOINVERSE),
  148. MAKE_SCODE_ENTRY(MK_E_NOOBJECT),
  149. MAKE_SCODE_ENTRY(MK_E_NOPREFIX),
  150. MAKE_SCODE_ENTRY(MK_E_NOSTORAGE),
  151. MAKE_SCODE_ENTRY(MK_E_NOTBINDABLE),
  152. MAKE_SCODE_ENTRY(MK_E_NOTBOUND),
  153. MAKE_SCODE_ENTRY(MK_E_SYNTAX),
  154. MAKE_SCODE_ENTRY(MK_E_UNAVAILABLE),
  155. MAKE_SCODE_ENTRY(OLE_E_ADVF),
  156. MAKE_SCODE_ENTRY(OLE_E_ADVISENOTSUPPORTED),
  157. MAKE_SCODE_ENTRY(OLE_E_BLANK),
  158. MAKE_SCODE_ENTRY(OLE_E_CANT_BINDTOSOURCE),
  159. MAKE_SCODE_ENTRY(OLE_E_CANT_GETMONIKER),
  160. MAKE_SCODE_ENTRY(OLE_E_CANTCONVERT),
  161. MAKE_SCODE_ENTRY(OLE_E_CLASSDIFF),
  162. MAKE_SCODE_ENTRY(OLE_E_ENUM_NOMORE),
  163. MAKE_SCODE_ENTRY(OLE_E_INVALIDHWND),
  164. MAKE_SCODE_ENTRY(OLE_E_INVALIDRECT),
  165. MAKE_SCODE_ENTRY(OLE_E_NOCACHE),
  166. MAKE_SCODE_ENTRY(OLE_E_NOCONNECTION),
  167. MAKE_SCODE_ENTRY(OLE_E_NOSTORAGE),
  168. MAKE_SCODE_ENTRY(OLE_E_NOT_INPLACEACTIVE),
  169. MAKE_SCODE_ENTRY(OLE_E_NOTRUNNING),
  170. MAKE_SCODE_ENTRY(OLE_E_OLEVERB),
  171. MAKE_SCODE_ENTRY(OLE_E_PROMPTSAVECANCELLED),
  172. MAKE_SCODE_ENTRY(OLE_E_STATIC),
  173. MAKE_SCODE_ENTRY(OLE_E_WRONGCOMPOBJ),
  174. MAKE_SCODE_ENTRY(OLEOBJ_E_INVALIDVERB),
  175. MAKE_SCODE_ENTRY(OLEOBJ_E_NOVERBS),
  176. MAKE_SCODE_ENTRY(REGDB_E_CLASSNOTREG),
  177. MAKE_SCODE_ENTRY(REGDB_E_IIDNOTREG),
  178. MAKE_SCODE_ENTRY(REGDB_E_INVALIDVALUE),
  179. MAKE_SCODE_ENTRY(REGDB_E_KEYMISSING),
  180. MAKE_SCODE_ENTRY(REGDB_E_READREGDB),
  181. MAKE_SCODE_ENTRY(REGDB_E_WRITEREGDB),
  182. MAKE_SCODE_ENTRY(RPC_E_ATTEMPTED_MULTITHREAD),
  183. MAKE_SCODE_ENTRY(RPC_E_CALL_CANCELED),
  184. MAKE_SCODE_ENTRY(RPC_E_CALL_REJECTED),
  185. MAKE_SCODE_ENTRY(RPC_E_CANTCALLOUT_AGAIN),
  186. MAKE_SCODE_ENTRY(RPC_E_CANTCALLOUT_INASYNCCALL),
  187. MAKE_SCODE_ENTRY(RPC_E_CANTCALLOUT_INEXTERNALCALL),
  188. MAKE_SCODE_ENTRY(RPC_E_CANTCALLOUT_ININPUTSYNCCALL),
  189. MAKE_SCODE_ENTRY(RPC_E_CANTPOST_INSENDCALL),
  190. MAKE_SCODE_ENTRY(RPC_E_CANTTRANSMIT_CALL),
  191. MAKE_SCODE_ENTRY(RPC_E_CHANGED_MODE),
  192. MAKE_SCODE_ENTRY(RPC_E_CLIENT_CANTMARSHAL_DATA),
  193. MAKE_SCODE_ENTRY(RPC_E_CLIENT_CANTUNMARSHAL_DATA),
  194. MAKE_SCODE_ENTRY(RPC_E_CLIENT_DIED),
  195. MAKE_SCODE_ENTRY(RPC_E_CONNECTION_TERMINATED),
  196. MAKE_SCODE_ENTRY(RPC_E_DISCONNECTED),
  197. MAKE_SCODE_ENTRY(RPC_E_FAULT),
  198. MAKE_SCODE_ENTRY(RPC_E_INVALID_CALLDATA),
  199. MAKE_SCODE_ENTRY(RPC_E_INVALID_DATA),
  200. MAKE_SCODE_ENTRY(RPC_E_INVALID_DATAPACKET),
  201. MAKE_SCODE_ENTRY(RPC_E_INVALID_PARAMETER),
  202. MAKE_SCODE_ENTRY(RPC_E_INVALIDMETHOD),
  203. MAKE_SCODE_ENTRY(RPC_E_NOT_REGISTERED),
  204. MAKE_SCODE_ENTRY(RPC_E_OUT_OF_RESOURCES),
  205. MAKE_SCODE_ENTRY(RPC_E_RETRY),
  206. MAKE_SCODE_ENTRY(RPC_E_SERVER_CANTMARSHAL_DATA),
  207. MAKE_SCODE_ENTRY(RPC_E_SERVER_CANTUNMARSHAL_DATA),
  208. MAKE_SCODE_ENTRY(RPC_E_SERVER_DIED),
  209. MAKE_SCODE_ENTRY(RPC_E_SERVER_DIED_DNE),
  210. MAKE_SCODE_ENTRY(RPC_E_SERVERCALL_REJECTED),
  211. MAKE_SCODE_ENTRY(RPC_E_SERVERCALL_RETRYLATER),
  212. MAKE_SCODE_ENTRY(RPC_E_SERVERFAULT),
  213. MAKE_SCODE_ENTRY(RPC_E_SYS_CALL_FAILED),
  214. MAKE_SCODE_ENTRY(RPC_E_THREAD_NOT_INIT),
  215. MAKE_SCODE_ENTRY(RPC_E_UNEXPECTED),
  216. MAKE_SCODE_ENTRY(RPC_E_WRONG_THREAD),
  217. MAKE_SCODE_ENTRY(STG_E_ABNORMALAPIEXIT),
  218. MAKE_SCODE_ENTRY(STG_E_ACCESSDENIED),
  219. MAKE_SCODE_ENTRY(STG_E_CANTSAVE),
  220. MAKE_SCODE_ENTRY(STG_E_DISKISWRITEPROTECTED),
  221. MAKE_SCODE_ENTRY(STG_E_EXTANTMARSHALLINGS),
  222. MAKE_SCODE_ENTRY(STG_E_FILEALREADYEXISTS),
  223. MAKE_SCODE_ENTRY(STG_E_FILENOTFOUND),
  224. MAKE_SCODE_ENTRY(STG_E_INSUFFICIENTMEMORY),
  225. MAKE_SCODE_ENTRY(STG_E_INUSE),
  226. MAKE_SCODE_ENTRY(STG_E_INVALIDFLAG),
  227. MAKE_SCODE_ENTRY(STG_E_INVALIDFUNCTION),
  228. MAKE_SCODE_ENTRY(STG_E_INVALIDHANDLE),
  229. MAKE_SCODE_ENTRY(STG_E_INVALIDHEADER),
  230. MAKE_SCODE_ENTRY(STG_E_INVALIDNAME),
  231. MAKE_SCODE_ENTRY(STG_E_INVALIDPARAMETER),
  232. MAKE_SCODE_ENTRY(STG_E_INVALIDPOINTER),
  233. MAKE_SCODE_ENTRY(STG_E_LOCKVIOLATION),
  234. MAKE_SCODE_ENTRY(STG_E_MEDIUMFULL),
  235. MAKE_SCODE_ENTRY(STG_E_NOMOREFILES),
  236. MAKE_SCODE_ENTRY(STG_E_NOTCURRENT),
  237. MAKE_SCODE_ENTRY(STG_E_NOTFILEBASEDSTORAGE),
  238. MAKE_SCODE_ENTRY(STG_E_OLDDLL),
  239. MAKE_SCODE_ENTRY(STG_E_OLDFORMAT),
  240. MAKE_SCODE_ENTRY(STG_E_PATHNOTFOUND),
  241. MAKE_SCODE_ENTRY(STG_E_READFAULT),
  242. MAKE_SCODE_ENTRY(STG_E_REVERTED),
  243. MAKE_SCODE_ENTRY(STG_E_SEEKERROR),
  244. MAKE_SCODE_ENTRY(STG_E_SHAREREQUIRED),
  245. MAKE_SCODE_ENTRY(STG_E_SHAREVIOLATION),
  246. MAKE_SCODE_ENTRY(STG_E_TOOMANYOPENFILES),
  247. MAKE_SCODE_ENTRY(STG_E_UNIMPLEMENTEDFUNCTION),
  248. MAKE_SCODE_ENTRY(STG_E_UNKNOWN),
  249. MAKE_SCODE_ENTRY(STG_E_WRITEFAULT),
  250. MAKE_SCODE_ENTRY(TYPE_E_AMBIGUOUSNAME),
  251. MAKE_SCODE_ENTRY(TYPE_E_BADMODULEKIND),
  252. MAKE_SCODE_ENTRY(TYPE_E_BUFFERTOOSMALL),
  253. MAKE_SCODE_ENTRY(TYPE_E_CANTCREATETMPFILE),
  254. MAKE_SCODE_ENTRY(TYPE_E_CANTLOADLIBRARY),
  255. MAKE_SCODE_ENTRY(TYPE_E_CIRCULARTYPE),
  256. MAKE_SCODE_ENTRY(TYPE_E_DLLFUNCTIONNOTFOUND),
  257. MAKE_SCODE_ENTRY(TYPE_E_DUPLICATEID),
  258. MAKE_SCODE_ENTRY(TYPE_E_ELEMENTNOTFOUND),
  259. MAKE_SCODE_ENTRY(TYPE_E_INCONSISTENTPROPFUNCS),
  260. MAKE_SCODE_ENTRY(TYPE_E_INVALIDSTATE),
  261. MAKE_SCODE_ENTRY(TYPE_E_INVDATAREAD),
  262. MAKE_SCODE_ENTRY(TYPE_E_IOERROR),
  263. MAKE_SCODE_ENTRY(TYPE_E_LIBNOTREGISTERED),
  264. MAKE_SCODE_ENTRY(TYPE_E_NAMECONFLICT),
  265. MAKE_SCODE_ENTRY(TYPE_E_OUTOFBOUNDS),
  266. MAKE_SCODE_ENTRY(TYPE_E_QUALIFIEDNAMEDISALLOWED),
  267. MAKE_SCODE_ENTRY(TYPE_E_REGISTRYACCESS),
  268. MAKE_SCODE_ENTRY(TYPE_E_SIZETOOBIG),
  269. MAKE_SCODE_ENTRY(TYPE_E_TYPEMISMATCH),
  270. MAKE_SCODE_ENTRY(TYPE_E_UNDEFINEDTYPE),
  271. MAKE_SCODE_ENTRY(TYPE_E_UNKNOWNLCID),
  272. MAKE_SCODE_ENTRY(TYPE_E_UNSUPFORMAT),
  273. MAKE_SCODE_ENTRY(TYPE_E_WRONGTYPEKIND),
  274. MAKE_SCODE_ENTRY(VIEW_E_DRAW),
  275. };
  276. #undef MAKE_SCODE_ENTRY
  277. // look for it in the table
  278. for (int i = 0; i < _countof(scNameTable); i++)
  279. {
  280. if (sc == scNameTable[i].sc)
  281. return scNameTable[i].lpszName;
  282. }
  283. return NULL; // not found
  284. }
  285. LPCTSTR AFXAPI AfxGetScodeRangeString(SCODE sc)
  286. {
  287. struct RANGE_ENTRY
  288. {
  289. SCODE scFirst;
  290. SCODE scLast;
  291. LPCTSTR lpszName;
  292. };
  293. #define MAKE_RANGE_ENTRY(scRange) \
  294. { scRange##_FIRST, scRange##_LAST, \
  295. _T(#scRange) _T("_FIRST...") _T(#scRange) _T("_LAST") }
  296. static const RANGE_ENTRY scRangeTable[] =
  297. {
  298. MAKE_RANGE_ENTRY(CACHE_E),
  299. MAKE_RANGE_ENTRY(CACHE_S),
  300. MAKE_RANGE_ENTRY(CLASSFACTORY_E),
  301. MAKE_RANGE_ENTRY(CLASSFACTORY_S),
  302. MAKE_RANGE_ENTRY(CLIENTSITE_E),
  303. MAKE_RANGE_ENTRY(CLIENTSITE_S),
  304. MAKE_RANGE_ENTRY(CLIPBRD_E),
  305. MAKE_RANGE_ENTRY(CLIPBRD_S),
  306. MAKE_RANGE_ENTRY(CONVERT10_E),
  307. MAKE_RANGE_ENTRY(CONVERT10_S),
  308. MAKE_RANGE_ENTRY(CO_E),
  309. MAKE_RANGE_ENTRY(CO_S),
  310. MAKE_RANGE_ENTRY(DATA_E),
  311. MAKE_RANGE_ENTRY(DATA_S),
  312. MAKE_RANGE_ENTRY(DRAGDROP_E),
  313. MAKE_RANGE_ENTRY(DRAGDROP_S),
  314. MAKE_RANGE_ENTRY(ENUM_E),
  315. MAKE_RANGE_ENTRY(ENUM_S),
  316. MAKE_RANGE_ENTRY(INPLACE_E),
  317. MAKE_RANGE_ENTRY(INPLACE_S),
  318. MAKE_RANGE_ENTRY(MARSHAL_E),
  319. MAKE_RANGE_ENTRY(MARSHAL_S),
  320. MAKE_RANGE_ENTRY(MK_E),
  321. MAKE_RANGE_ENTRY(MK_S),
  322. MAKE_RANGE_ENTRY(OLEOBJ_E),
  323. MAKE_RANGE_ENTRY(OLEOBJ_S),
  324. MAKE_RANGE_ENTRY(OLE_E),
  325. MAKE_RANGE_ENTRY(OLE_S),
  326. MAKE_RANGE_ENTRY(REGDB_E),
  327. MAKE_RANGE_ENTRY(REGDB_S),
  328. MAKE_RANGE_ENTRY(VIEW_E),
  329. MAKE_RANGE_ENTRY(VIEW_S),
  330. };
  331. #undef MAKE_RANGE_ENTRY
  332. // look for it in the table
  333. for (int i = 0; i < _countof(scRangeTable); i++)
  334. {
  335. if (sc >= scRangeTable[i].scFirst && sc <= scRangeTable[i].scLast)
  336. return scRangeTable[i].lpszName;
  337. }
  338. return NULL; // not found
  339. }
  340. LPCTSTR AFXAPI AfxGetSeverityString(SCODE sc)
  341. {
  342. static const TCHAR* rgszSEVERITY[] =
  343. {
  344. _T("SEVERITY_SUCCESS"),
  345. _T("SEVERITY_ERROR"),
  346. };
  347. return rgszSEVERITY[SCODE_SEVERITY(sc)];
  348. }
  349. LPCTSTR AFXAPI AfxGetFacilityString(SCODE sc)
  350. {
  351. static const TCHAR* rgszFACILITY[] =
  352. {
  353. _T("FACILITY_NULL"),
  354. _T("FACILITY_RPC"),
  355. _T("FACILITY_DISPATCH"),
  356. _T("FACILITY_STORAGE"),
  357. _T("FACILITY_ITF"),
  358. _T("FACILITY_0x05"),
  359. _T("FACILITY_0x06"),
  360. _T("FACILITY_WIN32"),
  361. _T("FACILITY_WINDOWS"),
  362. };
  363. if (SCODE_FACILITY(sc) >= _countof(rgszFACILITY))
  364. return _T("<Unknown Facility>");
  365. return rgszFACILITY[SCODE_FACILITY(sc)];
  366. }
  367. LPCTSTR AFXAPI AfxGetFullScodeString(SCODE sc)
  368. {
  369. static TCHAR szBuf[128];
  370. LPCTSTR lpsz;
  371. if ((lpsz = AfxGetScodeString(sc)) != NULL)
  372. {
  373. // found exact match
  374. wsprintf(szBuf, _T("%s ($%08lX)"), lpsz, sc);
  375. }
  376. else if ((lpsz = AfxGetScodeRangeString(sc)) != NULL)
  377. {
  378. // found suitable range
  379. wsprintf(szBuf, _T("range: %s ($%08lX)"), lpsz, sc);
  380. }
  381. else
  382. {
  383. // not found at all -- split it up into its parts
  384. wsprintf(szBuf, _T("severity: %s, facility: %s ($%08lX)"),
  385. AfxGetSeverityString(sc), AfxGetFacilityString(sc), sc);
  386. }
  387. return szBuf;
  388. }
  389. #endif //_DEBUG
  390. /////////////////////////////////////////////////////////////////////////////
  391. // Exceptions for OLE Support
  392. void AFXAPI AfxThrowOleException(SCODE sc)
  393. {
  394. #ifdef _DEBUG
  395. TRACE1("Warning: constructing COleException, scode = %s.\n",
  396. AfxGetFullScodeString(sc));
  397. #endif
  398. COleException* pException = new COleException;
  399. pException->m_sc = sc;
  400. THROW(pException);
  401. }
  402. BOOL COleException::GetErrorMessage(LPTSTR lpszError, UINT nMaxError,
  403. PUINT pnHelpContext)
  404. {
  405. ASSERT(lpszError != NULL && AfxIsValidString(lpszError, nMaxError));
  406. if (pnHelpContext != NULL)
  407. *pnHelpContext = 0;
  408. LPTSTR lpBuffer;
  409. if (::FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
  410. FORMAT_MESSAGE_FROM_SYSTEM,
  411. NULL, m_sc,
  412. MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT),
  413. (LPTSTR) &lpBuffer, 0, NULL) == 0)
  414. {
  415. *lpszError = '\0';
  416. return FALSE;
  417. }
  418. else
  419. {
  420. lstrcpyn(lpszError, lpBuffer, nMaxError);
  421. LocalFree(lpBuffer);
  422. return TRUE;
  423. }
  424. }
  425. /////////////////////////////////////////////////////////////////////////////
  426. // Turn a caught exception into an OLE return code
  427. SCODE PASCAL COleException::Process(const CException* pAnyException)
  428. {
  429. SCODE sc;
  430. if (pAnyException->IsKindOf(RUNTIME_CLASS(COleException)))
  431. sc = ((COleException*)pAnyException)->m_sc;
  432. else if (pAnyException->IsKindOf(RUNTIME_CLASS(CMemoryException)))
  433. sc = E_OUTOFMEMORY;
  434. else if (pAnyException->IsKindOf(RUNTIME_CLASS(CNotSupportedException)))
  435. sc = E_NOTIMPL;
  436. else
  437. sc = E_UNEXPECTED; // some other problem
  438. return sc;
  439. }
  440. /////////////////////////////////////////////////////////////////////////////
  441. // Implementation helpers
  442. HMENU AFXAPI AfxMergeMenus(HMENU hMenuShared, HMENU hMenuSource,
  443. LONG* lpMenuWidths, int iWidthIndex, BOOL bMergeHelpMenus /* = FALSE */)
  444. {
  445. ASSERT(hMenuShared != NULL && IsMenu(hMenuShared));
  446. ASSERT(hMenuSource != NULL && IsMenu(hMenuSource));
  447. BOOL bHelpMergedAsSubMenu = FALSE;
  448. HMENU hHelpSubMenu = NULL;
  449. // copy the popups from the pMenuSource
  450. int cMenuItems = GetMenuItemCount(hMenuSource);
  451. int cGroupWidth = 0;
  452. int nPosition = 0;
  453. // insert at appropriate spot depending on iWidthIndex
  454. ASSERT(iWidthIndex == 0 || iWidthIndex == 1);
  455. if (iWidthIndex == 1)
  456. nPosition = (int)lpMenuWidths[0];
  457. for (int i = 0; i < cMenuItems; i++)
  458. {
  459. // get the HMENU of the popup
  460. HMENU hMenuPopup = ::GetSubMenu(hMenuSource, i);
  461. // separators move us to next group
  462. UINT state = GetMenuState(hMenuSource, i, MF_BYPOSITION);
  463. if (hMenuPopup == NULL && (state & MF_SEPARATOR) != 0)
  464. {
  465. ASSERT(iWidthIndex <= 5); // servers should not touch past 5
  466. lpMenuWidths[iWidthIndex] = cGroupWidth;
  467. cGroupWidth = 0;
  468. if (iWidthIndex < 5)
  469. nPosition += (int)lpMenuWidths[iWidthIndex+1];
  470. iWidthIndex += 2;
  471. }
  472. else
  473. {
  474. HMENU hHelpMenu = NULL;
  475. // are we processing the help menu group?
  476. if (bMergeHelpMenus && iWidthIndex == 5)
  477. {
  478. // if so, see if the container has Help any menu items
  479. if (lpMenuWidths[iWidthIndex] == 1)
  480. {
  481. // get the help menu from the container
  482. hHelpMenu = GetSubMenu(hMenuShared, nPosition);
  483. }
  484. }
  485. // get the menu item text
  486. TCHAR szItemText[256];
  487. int nLen = GetMenuString(hMenuSource, i, szItemText,
  488. sizeof szItemText, MF_BYPOSITION);
  489. // popups are handled differently than normal menu items
  490. if (hMenuPopup != NULL)
  491. {
  492. if (hHelpMenu != NULL)
  493. {
  494. CString strTearOff = AfxGetAppName();
  495. if (!strTearOff.IsEmpty())
  496. strTearOff += ' ';
  497. strTearOff += szItemText;
  498. // container has help items -- add ours to its submenu
  499. AppendMenu(hHelpMenu, MF_STRING | MF_POPUP,
  500. (UINT)hMenuPopup, strTearOff);
  501. // clear the count of Help group items and add
  502. // the help menu to the window group
  503. lpMenuWidths[iWidthIndex] = 0;
  504. lpMenuWidths[iWidthIndex-1]++;
  505. bHelpMergedAsSubMenu = TRUE;
  506. hHelpSubMenu = hMenuPopup;
  507. }
  508. else if (::GetMenuItemCount(hMenuPopup) != 0)
  509. {
  510. // strip the HIBYTE because it contains a count of items
  511. state = LOBYTE(state) | MF_POPUP; // must be popup
  512. // non-empty popup -- add it to the shared menu bar
  513. InsertMenu(hMenuShared, nPosition, state | MF_BYPOSITION,
  514. (UINT)hMenuPopup, szItemText);
  515. ++nPosition;
  516. ++cGroupWidth;
  517. }
  518. }
  519. else if (nLen > 0)
  520. {
  521. // only non-empty items are added
  522. ASSERT(szItemText[0] != 0);
  523. // here the state does not contain a count in the HIBYTE
  524. InsertMenu(hMenuShared, nPosition, state | MF_BYPOSITION,
  525. GetMenuItemID(hMenuSource, i), szItemText);
  526. ++nPosition;
  527. ++cGroupWidth;
  528. }
  529. }
  530. }
  531. // set the last group width
  532. if (!bHelpMergedAsSubMenu)
  533. {
  534. ASSERT(iWidthIndex <= 5); // servers should not touch past 5
  535. lpMenuWidths[iWidthIndex] = cGroupWidth;
  536. }
  537. return hHelpSubMenu;
  538. }
  539. void AFXAPI AfxUnmergeMenus(HMENU hMenuShared, HMENU hMenuSource,
  540. HMENU hHelpMenuPopup /* = NULL */)
  541. {
  542. ASSERT(hMenuShared != NULL && IsMenu(hMenuShared));
  543. ASSERT(hMenuSource != NULL && IsMenu(hMenuSource));
  544. ASSERT(hHelpMenuPopup == NULL || IsMenu(hHelpMenuPopup));
  545. int cOurItems = GetMenuItemCount(hMenuSource);
  546. int cMenuItems = GetMenuItemCount(hMenuShared);
  547. for (int i = cMenuItems-1; i >= 0; i--)
  548. {
  549. // check out the popup menus
  550. HMENU hMenuPopup = ::GetSubMenu(hMenuShared, i);
  551. if (hMenuPopup != NULL)
  552. {
  553. // if we have a Help submenu, check to see if it appears in this
  554. // submenu someplace... this normally happens only in
  555. // DocObject frame windows
  556. if (hHelpMenuPopup != NULL)
  557. {
  558. int cPopupItems = ::GetMenuItemCount(hMenuPopup);
  559. for (int k = 0; k < cPopupItems; k++)
  560. {
  561. if (::GetSubMenu(hMenuPopup, k) == hHelpMenuPopup)
  562. {
  563. ::RemoveMenu(hMenuPopup, k, MF_BYPOSITION);
  564. hHelpMenuPopup = NULL; // can only have one
  565. break;
  566. }
  567. }
  568. }
  569. else
  570. {
  571. // if it is one of ours, remove it from the pMenuShared
  572. for (int j = 0; j < cOurItems; j++)
  573. {
  574. if (::GetSubMenu(hMenuSource, j) == hMenuPopup)
  575. {
  576. // remove the menu from pMenuShared
  577. RemoveMenu(hMenuShared, i, MF_BYPOSITION);
  578. break;
  579. }
  580. }
  581. }
  582. }
  583. }
  584. }
  585. // Helper for creating default FORMATETC from cfFormat
  586. LPFORMATETC AFXAPI _AfxFillFormatEtc(
  587. LPFORMATETC lpFormatEtc, CLIPFORMAT cfFormat, LPFORMATETC lpFormatEtcFill)
  588. {
  589. ASSERT(lpFormatEtcFill != NULL);
  590. if (lpFormatEtc == NULL && cfFormat != 0)
  591. {
  592. lpFormatEtc = lpFormatEtcFill;
  593. lpFormatEtc->cfFormat = cfFormat;
  594. lpFormatEtc->ptd = NULL;
  595. lpFormatEtc->dwAspect = DVASPECT_CONTENT;
  596. lpFormatEtc->lindex = -1;
  597. lpFormatEtc->tymed = (DWORD) -1;
  598. }
  599. return lpFormatEtc;
  600. }
  601. AFX_STATIC HGLOBAL AFXAPI _AfxCopyGlobalMemory(HGLOBAL hDest, HGLOBAL hSource)
  602. {
  603. ASSERT(hSource != NULL);
  604. // make sure we have suitable hDest
  605. DWORD nSize = ::GlobalSize(hSource);
  606. if (hDest == NULL)
  607. {
  608. hDest = ::GlobalAlloc(GMEM_SHARE|GMEM_MOVEABLE, nSize);
  609. if (hDest == NULL)
  610. return NULL;
  611. }
  612. else if (nSize > ::GlobalSize(hDest))
  613. {
  614. // hDest is not large enough
  615. return NULL;
  616. }
  617. // copy the bits
  618. LPVOID lpSource = ::GlobalLock(hSource);
  619. LPVOID lpDest = ::GlobalLock(hDest);
  620. ASSERT(lpDest != NULL);
  621. ASSERT(lpSource != NULL);
  622. memcpy(lpDest, lpSource, nSize);
  623. ::GlobalUnlock(hDest);
  624. ::GlobalUnlock(hSource);
  625. // success -- return hDest
  626. return hDest;
  627. }
  628. BOOL AFXAPI _AfxCopyStgMedium(
  629. CLIPFORMAT cfFormat, LPSTGMEDIUM lpDest, LPSTGMEDIUM lpSource)
  630. {
  631. if (lpDest->tymed == TYMED_NULL)
  632. {
  633. ASSERT(lpSource->tymed != TYMED_NULL);
  634. switch (lpSource->tymed)
  635. {
  636. case TYMED_ENHMF:
  637. case TYMED_HGLOBAL:
  638. ASSERT(sizeof(HGLOBAL) == sizeof(HENHMETAFILE));
  639. lpDest->tymed = lpSource->tymed;
  640. lpDest->hGlobal = NULL;
  641. break; // fall through to CopyGlobalMemory case
  642. case TYMED_ISTREAM:
  643. lpDest->pstm = lpSource->pstm;
  644. lpDest->pstm->AddRef();
  645. lpDest->tymed = TYMED_ISTREAM;
  646. return TRUE;
  647. case TYMED_ISTORAGE:
  648. lpDest->pstg = lpSource->pstg;
  649. lpDest->pstg->AddRef();
  650. lpDest->tymed = TYMED_ISTORAGE;
  651. return TRUE;
  652. case TYMED_MFPICT:
  653. {
  654. // copy LPMETAFILEPICT struct + embedded HMETAFILE
  655. HGLOBAL hDest = _AfxCopyGlobalMemory(NULL, lpSource->hGlobal);
  656. if (hDest == NULL)
  657. return FALSE;
  658. LPMETAFILEPICT lpPict = (LPMETAFILEPICT)::GlobalLock(hDest);
  659. ASSERT(lpPict != NULL);
  660. lpPict->hMF = ::CopyMetaFile(lpPict->hMF, NULL);
  661. if (lpPict->hMF == NULL)
  662. {
  663. ::GlobalUnlock(hDest);
  664. ::GlobalFree(hDest);
  665. return FALSE;
  666. }
  667. ::GlobalUnlock(hDest);
  668. // fill STGMEDIUM struct
  669. lpDest->hGlobal = hDest;
  670. lpDest->tymed = TYMED_MFPICT;
  671. }
  672. return TRUE;
  673. case TYMED_GDI:
  674. lpDest->tymed = TYMED_GDI;
  675. lpDest->hGlobal = NULL;
  676. break;
  677. case TYMED_FILE:
  678. {
  679. USES_CONVERSION;
  680. lpDest->tymed = TYMED_FILE;
  681. ASSERT(lpSource->lpszFileName != NULL);
  682. UINT cbSrc = ocslen(lpSource->lpszFileName);
  683. LPOLESTR szFileName = (LPOLESTR)CoTaskMemAlloc(cbSrc*sizeof(OLECHAR));
  684. lpDest->lpszFileName = szFileName;
  685. if (szFileName == NULL)
  686. return FALSE;
  687. memcpy(szFileName, lpSource->lpszFileName, (cbSrc+1)*sizeof(OLECHAR));
  688. return TRUE;
  689. }
  690. // unable to create + copy other TYMEDs
  691. default:
  692. return FALSE;
  693. }
  694. }
  695. ASSERT(lpDest->tymed == lpSource->tymed);
  696. switch (lpSource->tymed)
  697. {
  698. case TYMED_HGLOBAL:
  699. {
  700. HGLOBAL hDest = _AfxCopyGlobalMemory(lpDest->hGlobal,
  701. lpSource->hGlobal);
  702. if (hDest == NULL)
  703. return FALSE;
  704. lpDest->hGlobal = hDest;
  705. }
  706. return TRUE;
  707. case TYMED_ISTREAM:
  708. {
  709. ASSERT(lpDest->pstm != NULL);
  710. ASSERT(lpSource->pstm != NULL);
  711. // get the size of the source stream
  712. STATSTG stat;
  713. if (lpSource->pstm->Stat(&stat, STATFLAG_NONAME) != S_OK)
  714. {
  715. // unable to get size of source stream
  716. return FALSE;
  717. }
  718. ASSERT(stat.pwcsName == NULL);
  719. // always seek to zero before copy
  720. LARGE_INTEGER zero = { 0, 0 };
  721. lpDest->pstm->Seek(zero, STREAM_SEEK_SET, NULL);
  722. lpSource->pstm->Seek(zero, STREAM_SEEK_SET, NULL);
  723. // copy source to destination
  724. if (lpSource->pstm->CopyTo(lpDest->pstm, stat.cbSize,
  725. NULL, NULL) != NULL)
  726. {
  727. // copy from source to dest failed
  728. return FALSE;
  729. }
  730. // always seek to zero after copy
  731. lpDest->pstm->Seek(zero, STREAM_SEEK_SET, NULL);
  732. lpSource->pstm->Seek(zero, STREAM_SEEK_SET, NULL);
  733. }
  734. return TRUE;
  735. case TYMED_ISTORAGE:
  736. {
  737. ASSERT(lpDest->pstg != NULL);
  738. ASSERT(lpSource->pstg != NULL);
  739. // just copy source to destination
  740. if (lpSource->pstg->CopyTo(0, NULL, NULL, lpDest->pstg) != S_OK)
  741. return FALSE;
  742. }
  743. return TRUE;
  744. case TYMED_FILE:
  745. {
  746. USES_CONVERSION;
  747. ASSERT(lpSource->lpszFileName != NULL);
  748. ASSERT(lpDest->lpszFileName != NULL);
  749. return CopyFile(OLE2T(lpSource->lpszFileName), OLE2T(lpDest->lpszFileName), FALSE);
  750. }
  751. case TYMED_ENHMF:
  752. case TYMED_GDI:
  753. {
  754. ASSERT(sizeof(HGLOBAL) == sizeof(HENHMETAFILE));
  755. // with TYMED_GDI cannot copy into existing HANDLE
  756. if (lpDest->hGlobal != NULL)
  757. return FALSE;
  758. // otherwise, use OleDuplicateData for the copy
  759. lpDest->hGlobal = OleDuplicateData(lpSource->hGlobal, cfFormat, 0);
  760. if (lpDest->hGlobal == NULL)
  761. return FALSE;
  762. }
  763. return TRUE;
  764. // other TYMEDs cannot be copied
  765. default:
  766. return FALSE;
  767. }
  768. }
  769. /////////////////////////////////////////////////////////////////////////////
  770. // OLE utility functions (some borrowed from OLE2UI library)
  771. HGLOBAL AFXAPI _AfxOleGetObjectDescriptorData(
  772. CLSID clsid,
  773. DWORD dwDrawAspect,
  774. SIZEL sizel,
  775. POINTL pointl,
  776. DWORD dwStatus,
  777. LPCOLESTR lpszFullUserTypeName,
  778. LPCOLESTR lpszSrcOfCopy)
  779. {
  780. HGLOBAL hMem = NULL;
  781. LPOBJECTDESCRIPTOR lpOD;
  782. DWORD dwObjectDescSize, dwFullUserTypeNameLen, dwSrcOfCopyLen;
  783. // Get the length of Full User Type Name; Add 1 for the null terminator
  784. dwFullUserTypeNameLen = lpszFullUserTypeName ?
  785. ocslen(lpszFullUserTypeName)+1 : 0;
  786. // Get the Source of Copy string and it's length;
  787. // Add 1 for the null terminator
  788. if (lpszSrcOfCopy && lpszSrcOfCopy[0] != '\0')
  789. dwSrcOfCopyLen = ocslen(lpszSrcOfCopy)+1;
  790. else
  791. {
  792. // No src moniker so use user type name as source string.
  793. lpszSrcOfCopy = lpszFullUserTypeName;
  794. dwSrcOfCopyLen = dwFullUserTypeNameLen;
  795. }
  796. // Allocate space for OBJECTDESCRIPTOR and the additional string data
  797. dwObjectDescSize = sizeof(OBJECTDESCRIPTOR);
  798. hMem = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE | GMEM_ZEROINIT,
  799. dwObjectDescSize + (dwFullUserTypeNameLen + dwSrcOfCopyLen) *
  800. sizeof(OLECHAR));
  801. if (!hMem)
  802. return NULL;
  803. lpOD = (LPOBJECTDESCRIPTOR)GlobalLock(hMem);
  804. // Set the FullUserTypeName offset and copy the string
  805. if (lpszFullUserTypeName)
  806. {
  807. lpOD->dwFullUserTypeName = dwObjectDescSize;
  808. ocscpy((LPOLESTR)((LPBYTE)lpOD+lpOD->dwFullUserTypeName), lpszFullUserTypeName);
  809. }
  810. else
  811. lpOD->dwFullUserTypeName = 0; // zero offset indicates that string is not present
  812. // Set the SrcOfCopy offset and copy the string
  813. if (lpszSrcOfCopy)
  814. {
  815. lpOD->dwSrcOfCopy = dwObjectDescSize + dwFullUserTypeNameLen * sizeof(OLECHAR);
  816. ocscpy((LPOLESTR)((LPBYTE)lpOD+lpOD->dwSrcOfCopy), lpszSrcOfCopy);
  817. }
  818. else
  819. lpOD->dwSrcOfCopy = 0; // zero offset indicates that string is not present
  820. // Initialize the rest of the OBJECTDESCRIPTOR
  821. lpOD->cbSize = dwObjectDescSize +
  822. (dwFullUserTypeNameLen + dwSrcOfCopyLen) * sizeof(OLECHAR);
  823. lpOD->clsid = clsid;
  824. lpOD->dwDrawAspect = dwDrawAspect;
  825. lpOD->sizel = sizel;
  826. lpOD->pointl = pointl;
  827. lpOD->dwStatus = dwStatus;
  828. GlobalUnlock(hMem);
  829. return hMem;
  830. }
  831. HGLOBAL AFXAPI _AfxOleGetObjectDescriptorData(
  832. LPOLEOBJECT lpOleObj,
  833. LPCOLESTR lpszSrcOfCopy,
  834. DWORD dwDrawAspect,
  835. POINTL pointl,
  836. LPSIZEL lpSizelHim)
  837. {
  838. USES_CONVERSION;
  839. CLSID clsid;
  840. LPOLESTR lpszFullUserTypeName = NULL;
  841. LPMONIKER lpSrcMonikerOfCopy = NULL;
  842. HGLOBAL hObjDesc = NULL;
  843. IBindCtx *pbc = NULL;
  844. SCODE sc;
  845. SIZEL sizelHim;
  846. BOOL bFreeSrcOfCopy = FALSE;
  847. LPVIEWOBJECT2 lpViewObj2;
  848. LPOLELINK lpOleLink;
  849. BOOL fIsLink;
  850. TCHAR szLinkedTypeFmt[80];
  851. LPCOLESTR lpszLinkedTypeFmt;
  852. LPOLESTR lpszBuf = NULL;
  853. DWORD dwStatus = 0;
  854. // query for IOleLink
  855. lpOleLink = QUERYINTERFACE(lpOleObj, IOleLink);
  856. fIsLink = lpOleLink != NULL;
  857. // query for IViewObject2
  858. lpViewObj2 = QUERYINTERFACE(lpOleObj, IViewObject2);
  859. // Get CLSID
  860. sc = lpOleObj->GetUserClassID(&clsid);
  861. if (sc != S_OK)
  862. clsid = CLSID_NULL;
  863. // Get FullUserTypeName
  864. sc = lpOleObj->GetUserType(USERCLASSTYPE_FULL, &lpszFullUserTypeName);
  865. // if object is a link, then expand usertypename to be "Linked %s"
  866. if (fIsLink && lpszFullUserTypeName != NULL)
  867. {
  868. // Note: If this LoadString call fails, it is likely that
  869. // _AFX_NO_OLE_RESOURCES is defined in your .RC file.
  870. // To correct the situation remove the following line from your
  871. // resource script:
  872. // #define _AFX_NO_OLE_RESOURCES
  873. // This should be done using the Resource.Set Includes... command.
  874. VERIFY(AfxLoadString(AFX_IDS_PASTELINKEDTYPE, szLinkedTypeFmt));
  875. lpszLinkedTypeFmt = T2COLE(szLinkedTypeFmt);
  876. lpszBuf = (LPOLESTR)CoTaskMemAlloc((ocslen(lpszFullUserTypeName) +
  877. ocslen(lpszLinkedTypeFmt) + 1) * sizeof(OLECHAR));
  878. if (lpszBuf != NULL)
  879. {
  880. #ifdef OLE2ANSI
  881. sprintf(lpszBuf, lpszLinkedTypeFmt, lpszFullUserTypeName);
  882. #else
  883. swprintf(lpszBuf, lpszLinkedTypeFmt, lpszFullUserTypeName);
  884. #endif
  885. CoTaskMemFree(lpszFullUserTypeName);
  886. lpszFullUserTypeName = lpszBuf;
  887. }
  888. }
  889. // get source of copy
  890. if (fIsLink)
  891. {
  892. sc = lpOleLink->GetSourceDisplayName((LPOLESTR*)&lpszSrcOfCopy);
  893. bFreeSrcOfCopy = TRUE;
  894. }
  895. else if (lpszSrcOfCopy == NULL)
  896. {
  897. sc = lpOleObj->GetMoniker(
  898. OLEGETMONIKER_TEMPFORUSER, OLEWHICHMK_OBJFULL, &lpSrcMonikerOfCopy);
  899. if (sc == S_OK)
  900. {
  901. CreateBindCtx(0, &pbc);
  902. lpSrcMonikerOfCopy->GetDisplayName(pbc, NULL,
  903. (LPOLESTR*)&lpszSrcOfCopy);
  904. RELEASE(pbc);
  905. bFreeSrcOfCopy = TRUE;
  906. }
  907. }
  908. if (lpSizelHim)
  909. {
  910. // Use extents passed by the caller
  911. sizelHim = *lpSizelHim;
  912. }
  913. else if (lpViewObj2)
  914. {
  915. // Get the current extents from the object
  916. sc = lpViewObj2->GetExtent(dwDrawAspect, -1, NULL,
  917. (LPSIZEL)&sizelHim);
  918. if (sc != S_OK)
  919. sizelHim.cx = sizelHim.cy = 0;
  920. }
  921. else
  922. {
  923. sizelHim.cx = sizelHim.cy = 0;
  924. }
  925. // Get dwStatus
  926. sc = lpOleObj->GetMiscStatus(dwDrawAspect, &dwStatus);
  927. if (sc != S_OK)
  928. dwStatus = 0;
  929. // Get OBJECTDESCRIPTOR
  930. hObjDesc = _AfxOleGetObjectDescriptorData(clsid, dwDrawAspect, sizelHim,
  931. pointl, dwStatus, lpszFullUserTypeName, lpszSrcOfCopy);
  932. // Clean up
  933. CoTaskMemFree(lpszFullUserTypeName);
  934. if (bFreeSrcOfCopy)
  935. CoTaskMemFree((LPOLESTR)lpszSrcOfCopy);
  936. RELEASE(lpSrcMonikerOfCopy);
  937. RELEASE(lpOleLink);
  938. RELEASE(lpViewObj2);
  939. return hObjDesc;
  940. }
  941. SCODE AFXAPI _AfxOleDoConvert(LPSTORAGE lpStg, REFCLSID rClsidNew)
  942. {
  943. SCODE sc;
  944. CLSID clsidOld;
  945. if ((sc = ReadClassStg(lpStg, &clsidOld)) != S_OK)
  946. {
  947. clsidOld = CLSID_NULL;
  948. return sc;
  949. }
  950. // read old fmt/old user type; sets out params to NULL on error
  951. CLIPFORMAT cfOld;
  952. LPOLESTR lpszOld = NULL;
  953. sc = ReadFmtUserTypeStg(lpStg, &cfOld, &lpszOld);
  954. ASSERT(sc == S_OK || (cfOld == 0 && lpszOld == NULL));
  955. // get new user type name; if error, set to NULL string
  956. OLECHAR chZero = 0;
  957. LPOLESTR lpszNew = NULL;
  958. if (OleRegGetUserType(rClsidNew, USERCLASSTYPE_FULL, &lpszNew) != S_OK)
  959. lpszNew = &chZero;
  960. // write class stg
  961. if ((sc = WriteClassStg(lpStg, rClsidNew)) != S_OK)
  962. goto ErrorReturn;
  963. // write old fmt/new user type;
  964. if ((sc = WriteFmtUserTypeStg(lpStg, cfOld, lpszNew)) != S_OK)
  965. goto RewriteInfo;
  966. // set convert bit
  967. if ((sc = SetConvertStg(lpStg, TRUE)) != S_OK)
  968. goto RewriteInfo;
  969. goto ErrorReturn;
  970. RewriteInfo:
  971. WriteClassStg(lpStg, clsidOld);
  972. WriteFmtUserTypeStg(lpStg, cfOld, lpszOld);
  973. ErrorReturn:
  974. if (lpszNew != &chZero)
  975. CoTaskMemFree(lpszNew);
  976. CoTaskMemFree(lpszOld);
  977. return sc;
  978. }
  979. SCODE AFXAPI _AfxOleDoTreatAsClass(
  980. LPCTSTR lpszUserType, REFCLSID rclsid, REFCLSID rclsidNew)
  981. {
  982. LPTSTR lpszCLSID = NULL;
  983. HKEY hKey;
  984. SCODE sc = CoTreatAsClass(rclsid, rclsidNew);
  985. if (sc != S_OK && lpszUserType != NULL)
  986. {
  987. RegOpenKey(HKEY_CLASSES_ROOT, _T("CLSID"), &hKey);
  988. LPOLESTR lpOleStr = NULL;
  989. StringFromCLSID(rclsid, &lpOleStr);
  990. lpszCLSID = TASKSTRINGOLE2T(lpOleStr);
  991. RegSetValue(hKey, lpszCLSID, REG_SZ, lpszUserType,
  992. lstrlen(lpszUserType) * sizeof(TCHAR));
  993. CoTaskMemFree(lpszCLSID);
  994. sc = CoTreatAsClass(rclsid, rclsidNew);
  995. RegCloseKey(hKey);
  996. }
  997. return sc;
  998. }
  999. #define DEVNAMEPART(pdn, x) (pdn->x == 0 ? NULL : (LPCTSTR)pdn + pdn->x)
  1000. DVTARGETDEVICE* AFXAPI _AfxOleCreateTargetDevice(LPDEVNAMES pDN, LPDEVMODE pDM)
  1001. {
  1002. USES_CONVERSION;
  1003. DVTARGETDEVICE* ptd = NULL;
  1004. DWORD dwDevNamesSize, dwDevModeSize, dwPtdSize;
  1005. LPCTSTR lpszDriverName = DEVNAMEPART(pDN, wDriverOffset);
  1006. LPCTSTR lpszDeviceName = DEVNAMEPART(pDN, wDeviceOffset);
  1007. LPCTSTR lpszPortName = DEVNAMEPART(pDN, wOutputOffset);
  1008. LPCOLESTR lpszDriverNameOle = T2COLE(lpszDriverName);
  1009. LPCOLESTR lpszDeviceNameOle = T2COLE(lpszDeviceName);
  1010. LPCOLESTR lpszPortNameOle = T2COLE(lpszPortName);
  1011. int nDriverNameSize = (lpszDriverNameOle == NULL) ? 0 : (ocslen(lpszDriverNameOle)+1)*sizeof(OLECHAR);
  1012. int nDeviceNameSize = (lpszDeviceNameOle == NULL) ? 0 : (ocslen(lpszDeviceNameOle)+1)*sizeof(OLECHAR);
  1013. int nPortNameSize = (lpszPortNameOle == NULL) ? 0 : (ocslen(lpszPortNameOle)+1)*sizeof(OLECHAR);
  1014. LPDEVMODEOLE lpDevModeOle = DEVMODET2OLE(pDM);
  1015. dwDevNamesSize = nDriverNameSize + nDeviceNameSize + nPortNameSize;
  1016. dwDevModeSize = (DWORD)(lpDevModeOle->dmSize + lpDevModeOle->dmDriverExtra);
  1017. dwPtdSize = sizeof(DVTARGETDEVICE) + dwDevNamesSize + dwDevModeSize;
  1018. if ((ptd = (DVTARGETDEVICE*)CoTaskMemAlloc(dwPtdSize)) != NULL)
  1019. {
  1020. // copy in the info
  1021. ptd->tdSize = (UINT)dwPtdSize;
  1022. ptd->tdDriverNameOffset = sizeof(DVTARGETDEVICE);
  1023. ocscpy((LPOLESTR)((BYTE*)ptd + ptd->tdDriverNameOffset), lpszDriverNameOle);
  1024. ptd->tdDeviceNameOffset = (WORD)(ptd->tdDriverNameOffset + nDriverNameSize);
  1025. ocscpy((LPOLESTR)((BYTE*)ptd + ptd->tdDeviceNameOffset), lpszDeviceNameOle);
  1026. ptd->tdPortNameOffset = (WORD)(ptd->tdDeviceNameOffset + nDeviceNameSize);
  1027. ocscpy((LPOLESTR)((BYTE*)ptd + ptd->tdPortNameOffset), lpszPortNameOle);
  1028. ptd->tdExtDevmodeOffset = (WORD)(ptd->tdPortNameOffset + nPortNameSize);
  1029. memcpy((BYTE*)ptd + ptd->tdExtDevmodeOffset, lpDevModeOle,
  1030. sizeof(DEVMODEOLE)+lpDevModeOle->dmDriverExtra);
  1031. }
  1032. return ptd;
  1033. }
  1034. DVTARGETDEVICE* AFXAPI _AfxOleCreateTargetDevice(LPPRINTDLG lpPrintDlg)
  1035. {
  1036. DVTARGETDEVICE* ptd=NULL;
  1037. LPDEVNAMES pDN;
  1038. LPDEVMODE pDM;
  1039. if ((pDN = (LPDEVNAMES)GlobalLock(lpPrintDlg->hDevNames)) == NULL)
  1040. return NULL;
  1041. if ((pDM = (LPDEVMODE)GlobalLock(lpPrintDlg->hDevMode)) == NULL)
  1042. {
  1043. GlobalUnlock(lpPrintDlg->hDevNames);
  1044. return NULL;
  1045. }
  1046. ptd = _AfxOleCreateTargetDevice(pDN, pDM);
  1047. GlobalUnlock(lpPrintDlg->hDevNames);
  1048. GlobalUnlock(lpPrintDlg->hDevMode);
  1049. return ptd;
  1050. }
  1051. LPMONIKER AFXAPI _AfxOleGetFirstMoniker(LPMONIKER lpmk)
  1052. {
  1053. if (lpmk == NULL)
  1054. return NULL;
  1055. DWORD dwMksys;
  1056. if (lpmk->IsSystemMoniker(&dwMksys) == S_OK
  1057. && dwMksys == MKSYS_GENERICCOMPOSITE)
  1058. {
  1059. LPENUMMONIKER lpenumMoniker = NULL;
  1060. SCODE sc = lpmk->Enum(TRUE, &lpenumMoniker);
  1061. if (sc != S_OK)
  1062. return NULL;
  1063. ASSERT(lpenumMoniker != NULL);
  1064. LPMONIKER lpmkFirst = NULL;
  1065. sc = lpenumMoniker->Next(1, &lpmkFirst, NULL);
  1066. RELEASE(lpenumMoniker);
  1067. return lpmkFirst;
  1068. }
  1069. // otherwise -- return the moniker itself
  1070. lpmk->AddRef();
  1071. return lpmk;
  1072. }
  1073. DWORD AFXAPI _AfxOleGetLenFilePrefixOfMoniker(LPMONIKER lpmk)
  1074. {
  1075. USES_CONVERSION;
  1076. if (lpmk == NULL)
  1077. return 0;
  1078. DWORD nLen = 0;
  1079. LPMONIKER lpmkFirst = _AfxOleGetFirstMoniker(lpmk);
  1080. if (lpmkFirst != NULL)
  1081. {
  1082. DWORD dwMksys;
  1083. if (lpmkFirst->IsSystemMoniker(&dwMksys) == S_OK &&
  1084. dwMksys == MKSYS_FILEMONIKER)
  1085. {
  1086. LPBC lpbc = NULL;
  1087. SCODE sc = CreateBindCtx(0, &lpbc);
  1088. if (sc == S_OK)
  1089. {
  1090. LPOLESTR lpw = NULL;
  1091. sc = lpmkFirst->GetDisplayName(lpbc, NULL, &lpw);
  1092. LPTSTR lpsz = OLE2T(lpw);
  1093. if (sc == S_OK && lpsz != NULL)
  1094. {
  1095. nLen = lstrlen(lpsz);
  1096. CoTaskMemFree(lpw);
  1097. }
  1098. RELEASE(lpbc);
  1099. }
  1100. }
  1101. RELEASE(lpmkFirst);
  1102. }
  1103. return nLen;
  1104. }
  1105. DVTARGETDEVICE* AFXAPI _AfxOleCopyTargetDevice(DVTARGETDEVICE* ptdSrc)
  1106. {
  1107. if (ptdSrc == NULL)
  1108. return NULL;
  1109. DVTARGETDEVICE* ptdDest =
  1110. (DVTARGETDEVICE*)CoTaskMemAlloc(ptdSrc->tdSize);
  1111. if (ptdDest == NULL)
  1112. return NULL;
  1113. memcpy(ptdDest, ptdSrc, (size_t)ptdSrc->tdSize);
  1114. return ptdDest;
  1115. }
  1116. void AFXAPI _AfxOleCopyFormatEtc(LPFORMATETC petcDest, LPFORMATETC petcSrc)
  1117. {
  1118. ASSERT(petcDest != NULL);
  1119. ASSERT(petcSrc != NULL);
  1120. petcDest->cfFormat = petcSrc->cfFormat;
  1121. petcDest->ptd = _AfxOleCopyTargetDevice(petcSrc->ptd);
  1122. petcDest->dwAspect = petcSrc->dwAspect;
  1123. petcDest->lindex = petcSrc->lindex;
  1124. petcDest->tymed = petcSrc->tymed;
  1125. }
  1126. HDC WINAPI _AfxOleCreateDC(DVTARGETDEVICE* ptd)
  1127. {
  1128. USES_CONVERSION;
  1129. // return screen DC for NULL target device
  1130. if (ptd == NULL)
  1131. return ::CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
  1132. LPDEVMODEOLE lpDevMode;
  1133. LPOLESTR lpszDriverName;
  1134. LPOLESTR lpszDeviceName;
  1135. LPOLESTR lpszPortName;
  1136. if (ptd->tdExtDevmodeOffset == 0)
  1137. lpDevMode = NULL;
  1138. else
  1139. lpDevMode = (LPDEVMODEOLE) ((LPSTR)ptd + ptd->tdExtDevmodeOffset);
  1140. lpszDriverName = (LPOLESTR)((BYTE*)ptd + ptd->tdDriverNameOffset);
  1141. lpszDeviceName = (LPOLESTR)((BYTE*)ptd + ptd->tdDeviceNameOffset);
  1142. lpszPortName = (LPOLESTR)((BYTE*)ptd + ptd->tdPortNameOffset);
  1143. return ::CreateDC(OLE2CT(lpszDriverName), OLE2CT(lpszDeviceName),
  1144. OLE2CT(lpszPortName), DEVMODEOLE2T(lpDevMode));
  1145. }
  1146. void AFXAPI _AfxDeleteMetafilePict(HGLOBAL hMetaPict)
  1147. {
  1148. if (hMetaPict != NULL)
  1149. {
  1150. STGMEDIUM stgMedium;
  1151. stgMedium.hGlobal = hMetaPict;
  1152. stgMedium.tymed = TYMED_MFPICT;
  1153. stgMedium.pUnkForRelease = NULL;
  1154. ReleaseStgMedium(&stgMedium);
  1155. }
  1156. }
  1157. #define HIMETRIC_PER_INCH 2540
  1158. #define MAP_PIX_TO_LOGHIM(x,ppli) MulDiv(HIMETRIC_PER_INCH, (x), (ppli))
  1159. #define MAP_LOGHIM_TO_PIX(x,ppli) MulDiv((ppli), (x), HIMETRIC_PER_INCH)
  1160. void AFXAPI _AfxXformSizeInPixelsToHimetric(
  1161. HDC hDC, LPSIZEL lpSizeInPix, LPSIZEL lpSizeInHiMetric)
  1162. {
  1163. int cxPPI;
  1164. int cyPPI;
  1165. if ((NULL == hDC) || (GetDeviceCaps(hDC, LOGPIXELSX) == 0))
  1166. {
  1167. cxPPI = afxData.cxPixelsPerInch;
  1168. cyPPI = afxData.cyPixelsPerInch;
  1169. }
  1170. else
  1171. {
  1172. cxPPI = GetDeviceCaps(hDC, LOGPIXELSX);
  1173. cyPPI = GetDeviceCaps(hDC, LOGPIXELSY);
  1174. }
  1175. lpSizeInHiMetric->cx = (long)MAP_PIX_TO_LOGHIM((int)lpSizeInPix->cx, cxPPI);
  1176. lpSizeInHiMetric->cy = (long)MAP_PIX_TO_LOGHIM((int)lpSizeInPix->cy, cyPPI);
  1177. }
  1178. void AFXAPI _AfxXformSizeInHimetricToPixels(
  1179. HDC hDC, LPSIZEL lpSizeInHiMetric, LPSIZEL lpSizeInPix)
  1180. {
  1181. int cxPPI;
  1182. int cyPPI;
  1183. if ((NULL == hDC) || (GetDeviceCaps(hDC, LOGPIXELSX) == 0))
  1184. {
  1185. cxPPI = afxData.cxPixelsPerInch;
  1186. cyPPI = afxData.cyPixelsPerInch;
  1187. }
  1188. else
  1189. {
  1190. cxPPI = GetDeviceCaps(hDC, LOGPIXELSX);
  1191. cyPPI = GetDeviceCaps(hDC, LOGPIXELSY);
  1192. }
  1193. lpSizeInPix->cx = (long)MAP_LOGHIM_TO_PIX((int)lpSizeInHiMetric->cx, cxPPI);
  1194. lpSizeInPix->cy = (long)MAP_LOGHIM_TO_PIX((int)lpSizeInHiMetric->cy, cyPPI);
  1195. }
  1196. #ifdef AFX_INIT_SEG
  1197. #pragma code_seg(AFX_INIT_SEG)
  1198. #endif
  1199. IMPLEMENT_DYNAMIC(COleException, CException)
  1200. /////////////////////////////////////////////////////////////////////////////