内存分配:使用IMalloc接口来分配内存



借助个Win32展示了如何利用OLEIMalloc接口来分配任务类型和共享类型内存





运行画面如下:











源码MALLOC.H:

    ="highlighter-cpp">
  1. ="preprocessor">#ndef_MALLOC_H_
  2. ="alt">="preprocessor">#_MALLOC_H_
  3. ="alt">="datatypes">LRESULTPASCALMallocWndProc(="datatypes">HWND,="datatypes">UINT,="datatypes">WPARAM,="datatypes">LPARAM);
  4. ="alt">="preprocessor">#CALLOCS10
  5. ="comment">/*
  6. ="alt">="comment">*Applicationdesandtypes.
  7. ="comment">*/
  8. ="alt">="keyword">CAppVars
  9. {
  10. ="alt">="keyword">friend="datatypes">LRESULTPASCALMallocWndProc(="datatypes">HWND,="datatypes">UINT,="datatypes">WPARAM,="datatypes">LPARAM);
  11. ="alt">="keyword">protected:
  12. ="datatypes">HINSTANCEm_hInst;
  13. ="alt">="datatypes">HINSTANCEm_hInstPrev;
  14. ="datatypes">UINTm_nCmdShow;
  15. ="alt">="datatypes">HWNDm_hWnd;
  16. LPMALLOCm_pIMalloc;
  17. ="alt">="datatypes">BOOLm_fInitialized;
  18. ="datatypes">ULONGm_rgcb[CALLOCS];="comment">//Sizestoallocate
  19. ="alt">="datatypes">LPVOIDm_rgpv[CALLOCS];="comment">//Allocatedpoers
  20. ="alt">="keyword">public:
  21. CAppVars(="datatypes">HINSTANCE,="datatypes">HINSTANCE,="datatypes">UINT);
  22. ="alt">~CAppVars(="keyword">void);
  23. ="datatypes">BOOLFInit(="keyword">void);
  24. ="alt">="keyword">voidFreeAllocations(="datatypes">BOOL);
  25. };
  26. ="alt">
  27. ="keyword">typedefCAppVarsFAR*LPAPPVARS;
  28. ="alt">
  29. ="preprocessor">#CBWNDEXTRA(LONG)
  30. ="alt">="preprocessor">#MALLOCWL_STRUCTURE0
  31. ="alt">="preprocessor">#end//_MALLOC_H_



如下是MALLOC.CPP文件内容:

    ="highlighter-cpp">
  1. ="preprocessor">#<windows.h>
  2. ="alt">="preprocessor">#<ole2.h>
  3. ="preprocessor">#<initguid.h>
  4. ="alt">="preprocessor">#<ole2ver.h>
  5. ="preprocessor">#"malloc.h"
  6. ="alt">="preprocessor">#"resource.h"
  7. ="alt">="datatypes">PASCALWinMain(="datatypes">HINSTANCEhInst,="datatypes">HINSTANCEhInstPrev,="datatypes">LPSTRpszCmdLine,="datatypes">nCmdShow)
  8. {
  9. ="alt">MSGmsg;
  10. LPAPPVARSpAV;
  11. ="alt">="datatypes">cMsg=96;
  12. ="preprocessor">#ndefWIN32
  13. ="alt">="keyword">while(!SetMessageQueue(cMsg)&&(cMsg-=8));
  14. ="preprocessor">#end
  15. ="alt">
  16. pAV=="keyword">CAppVars(hInst,hInstPrev,nCmdShow);
  17. ="alt">
  18. ="keyword">(NULLpAV)
  19. ="alt">{
  20. ="keyword">-1;
  21. ="alt">}
  22. ="keyword">(pAV->FInit)
  23. ="alt">{
  24. ="keyword">while(GetMessage(&msg,NULL,0,0))
  25. ="alt">{
  26. TranslateMessage(&msg);
  27. ="alt">DispatchMessage(&msg);
  28. }
  29. ="alt">}
  30. ="keyword">deletepAV;
  31. ="alt">="keyword">msg.wParam;
  32. }
  33. ="alt">
  34. ="datatypes">LRESULTPASCALMallocWndProc(="datatypes">HWNDhWnd,="datatypes">UINTiMsg,="datatypes">WPARAMwParam,="datatypes">LPARAMlParam)
  35. ="alt">{
  36. LPAPPVARSpAV;
  37. ="alt">="datatypes">LPVOIDpv;
  38. ="datatypes">ULONGcb;
  39. ="alt">="datatypes">UINTi;
  40. ="datatypes">BOOLfResult=TRUE;
  41. ="alt">="datatypes">HRESULThr;
  42. ="alt">pAV=(LPAPPVARS)GetWindowLong(hWnd,MALLOCWL_STRUCTURE);
  43. ="alt">="keyword">switch(iMsg)
  44. {
  45. ="alt">="keyword">WM_NCCREATE:
  46. pAV=(LPAPPVARS)((="datatypes">LONG)((LPCREATESTRUCT)lParam)->lpCreateParams);
  47. ="alt">SetWindowLong(hWnd,MALLOCWL_STRUCTURE,(="datatypes">LONG)pAV);
  48. ="keyword">(DefWindowProc(hWnd,iMsg,wParam,lParam));
  49. ="alt">
  50. ="keyword">WM_DESTROY:
  51. ="alt">PostQuitMessage(0);
  52. ="keyword">;
  53. ="alt">
  54. ="keyword">WM_COMMAND:
  55. ="alt">="keyword">switch(LOWORD(wParam))
  56. {
  57. ="alt">="keyword">IDM_IMALLOCCOGETMALLOCTASK:
  58. pAV->FreeAllocations(TRUE);
  59. ="alt">hr=CoGetMalloc(MEMCTX_TASK,&pAV->m_pIMalloc);
  60. fResult=SUCCEEDED(hr);
  61. ="alt">MessageBox(hWnd,((fResult)?TEXT(="">"CoGetMalloc(task)succeeded."):TEXT(="">"CoGetMalloc(task)failed.")),
  62. TEXT(="">"MALLOC"),MB_OK);
  63. ="alt">="keyword">;
  64. ="alt">="keyword">IDM_IMALLOCCOGETMALLOCSHARED:
  65. pAV->FreeAllocations(TRUE);
  66. ="alt">hr=CoGetMalloc(MEMCTX_SHARED,&pAV->m_pIMalloc);
  67. fResult=SUCCEEDED(hr);
  68. ="alt">MessageBox(hWnd,((fResult)?TEXT(="">"CoGetMalloc(shared)succeeded."):TEXT(="">"CoGetMalloc(shared)failed.")),
  69. TEXT(="">"MALLOC"),MB_OK);
  70. ="alt">="keyword">;
  71. ="alt">="keyword">IDM_IMALLOCRELEASE:
  72. pAV->FreeAllocations(TRUE);
  73. ="alt">MessageBox(hWnd,TEXT(="">"IMalloc::Releasefinished."),TEXT(="">"Malloc"),MB_OK);
  74. ="keyword">;
  75. ="alt">
  76. ="keyword">IDM_IMALLOCALLOC:
  77. ="alt">="keyword">(NULLpAV->m_pIMalloc)
  78. ="keyword">;
  79. ="alt">pAV->FreeAllocations(FALSE);
  80. ="keyword">for(i=0;i<CALLOCS;i)
  81. ="alt">{
  82. ="datatypes">LPBYTEpb;
  83. ="alt">="datatypes">ULONGiByte;
  84. cb=pAV->m_rgcb[i];
  85. ="alt">pAV->m_rgpv[i]=pAV->m_pIMalloc->Alloc(cb);
  86. ="comment">//Fillthememorywithletters
  87. ="alt">pb=(="datatypes">LPBYTE)pAV->m_rgpv[i];
  88. ="alt">="keyword">(NULL!=pb)
  89. {
  90. ="alt">="keyword">for(iByte=0;iByte<cb;iByte)
  91. {
  92. ="alt">*pb+(="">'a'+i);
  93. }
  94. ="alt">}
  95. fResult&=(NULL!=pAV->m_rgpv[i]);
  96. ="alt">}
  97. MessageBox(hWnd,((fResult)?TEXT(="">"IMalloc::Allocsucceeded."):TEXT(="">"IMalloc::Allocfailed.")),
  98. ="alt">TEXT(="">"MALLOC"),MB_OK);
  99. ="keyword">;
  100. ="alt">
  101. ="keyword">IDM_IMALLOCFREE:
  102. ="alt">pAV->FreeAllocations(FALSE);
  103. MessageBox(hWnd,TEXT(="">"IMalloc::Freefinished."),TEXT(="">"Malloc"),MB_OK);
  104. ="alt">="keyword">;
  105. ="alt">="keyword">IDM_IMALLOCREALLOC:
  106. ="keyword">(NULLpAV->m_pIMalloc)
  107. ="alt">="keyword">;
  108. ="keyword">for(i=0;i<CALLOCS;i)
  109. ="alt">{
  110. ="datatypes">LPBYTEpb;
  111. ="alt">="datatypes">ULONGiByte;
  112. pAV->m_rgcb[i]128;
  113. ="alt">pv=pAV->m_pIMalloc->Realloc(pAV->m_rgpv[i],pAV->m_rgcb[i]);
  114. ="keyword">(NULL!=pv)
  115. ="alt">{
  116. pAV->m_rgpv[i]=pv;
  117. ="alt">="comment">//Fillthememorywithsomethingwecansee.
  118. pb=(="datatypes">LPBYTE)pAV->m_rgpv[i];
  119. ="alt">cb=pAV->m_rgcb[i];
  120. ="keyword">(NULL!=pb)
  121. ="alt">{
  122. ="keyword">for(iByte=cb-128;iByte<cb;iByte)
  123. ="alt">{
  124. *pb+(="">'a'+i);
  125. ="alt">}
  126. }
  127. ="alt">}
  128. ="keyword">
  129. ="alt">{
  130. fResult=FALSE;
  131. ="alt">}
  132. }
  133. ="alt">MessageBox(hWnd,((fResult)?TEXT(="">"IMalloc::Reallocsucceeded."):TEXT(="">"IMalloc::Reallocfailed.")),
  134. TEXT(="">"Malloc"),MB_OK);
  135. ="alt">="keyword">;
  136. ="alt">="keyword">IDM_IMALLOCGETSIZE:
  137. ="keyword">(NULLpAV->m_pIMalloc)
  138. ="alt">{
  139. ="keyword">;
  140. ="alt">}
  141. ="keyword">for(i=0;i<CALLOCS;i)
  142. ="alt">{
  143. cb=pAV->m_pIMalloc->GetSize(pAV->m_rgpv[i]);
  144. ="alt">="comment">/*
  145. ="comment">*Wetestthatthesizeisatleastwhatwewanted.
  146. ="alt">="comment">*/
  147. fResult&=(pAV->m_rgcb[i]<=cb);
  148. ="alt">}
  149. MessageBox(hWnd,((fResult)?TEXT(="">"IMalloc::GetSizematched."):TEXT(="">"IMalloc::GetSizemismatch.")),
  150. ="alt">TEXT(="">"Malloc"),MB_OK);
  151. ="keyword">;
  152. ="alt">
  153. ="keyword">IDM_IMALLOCDIDALLOC:
  154. ="alt">="keyword">(NULLpAV->m_pIMalloc)
  155. ="keyword">;
  156. ="alt">="comment">/*
  157. ="comment">*DidAllocmay-1itdoesnotknow
  158. ="alt">="comment">*itactuallyallocatedsomething.Inthat,
  159. ="comment">*wejustblindly&ina-1withnoeffect.
  160. ="alt">="comment">*/
  161. ="keyword">for(i=0;i<CALLOCS;i)
  162. ="alt">{
  163. fResult&=pAV->m_pIMalloc->DidAlloc(pAV->m_rgpv[i]);
  164. ="alt">}
  165. MessageBox(hWnd,((fResult)?TEXT(="">"IMalloc::DidAllocisTRUE."):TEXT(="">"IMalloc::DidAllocisFALSE.")),
  166. ="alt">TEXT(="">"IMalloc"),MB_OK);
  167. ="keyword">;
  168. ="alt">
  169. ="keyword">IDM_IMALLOCHEAPMINIMIZE:
  170. ="alt">="keyword">(NULL!=pAV->m_pIMalloc)
  171. {
  172. ="alt">pAV->m_pIMalloc->HeapMinimize;
  173. }
  174. ="alt">MessageBox(hWnd,TEXT(="">"IMalloc::HeapMinimizefinished."),TEXT(="">"Malloc"),MB_OK);
  175. ="keyword">;
  176. ="alt">
  177. ="keyword">IDM_IMALLOCEXIT:
  178. ="alt">PostMessage(hWnd,WM_CLOSE,0,0L);
  179. ="keyword">;
  180. ="alt">}
  181. ="keyword">;
  182. ="alt">
  183. ="keyword">default:
  184. ="alt">="keyword">(DefWindowProc(hWnd,iMsg,wParam,lParam));
  185. }
  186. ="alt">="keyword">0L;
  187. }
  188. ="alt">
  189. CAppVars::CAppVars(="datatypes">HINSTANCEhInst,="datatypes">HINSTANCEhInstPrev,="datatypes">UINTnCmdShow)
  190. ="alt">{
  191. ="datatypes">UINTi;
  192. ="alt">="datatypes">ULONGcb;
  193. ="alt">="comment">//InitializeWinMainparameterholders.
  194. m_hInst=hInst;
  195. ="alt">m_hInstPrev=hInstPrev;
  196. m_nCmdShow=nCmdShow;
  197. ="alt">m_hWnd=NULL;
  198. m_pIMalloc=NULL;
  199. ="alt">m_fInitialized=FALSE;
  200. ="alt">="comment">//100isarbitrary.IMalloccanhandlelarger.
  201. cb=100;
  202. ="alt">="keyword">for(i=0;i<CALLOCS;i)
  203. {
  204. ="alt">m_rgcb[i]=cb;
  205. m_rgpv[i]=NULL;
  206. ="alt">cb*=2;
  207. }
  208. ="alt">="keyword">;
  209. }
  210. ="alt">
  211. CAppVars::~CAppVars(="keyword">void)
  212. ="alt">{
  213. FreeAllocations(TRUE);
  214. ="alt">="comment">//freetheenumeratorobjectwehaveone.
  215. ="keyword">(m_fInitialized)
  216. ="alt">{
  217. CoUninitialize;
  218. ="alt">}
  219. ="keyword">;
  220. ="alt">}
  221. ="alt">="datatypes">BOOLCAppVars::FInit
  222. {
  223. ="alt">WNDCLASSwc;
  224. ="datatypes">DWORDdwVer;
  225. ="alt">
  226. ="comment">//MakesureCOMPOBJ.DLListherightversion
  227. ="alt">dwVer=CoBuildVersion;
  228. ="keyword">(rmm!=HIWORD(dwVer))
  229. ="alt">="keyword">FALSE;
  230. ="alt">="comment">//CallCoInitializesothatwecancallotherCo...functions
  231. ="keyword">(FAILED(CoInitialize(NULL)))
  232. ="alt">="keyword">FALSE;
  233. ="alt">m_fInitialized=TRUE;
  234. ="alt">="keyword">(!m_hInstPrev)
  235. {
  236. ="alt">wc.style=CS_HREDRAW|CS_VREDRAW;
  237. wc.lpfnWndProc=MallocWndProc;
  238. ="alt">wc.cbClsExtra=0;
  239. wc.cbWndExtra=CBWNDEXTRA;
  240. ="alt">wc.hInstance=m_hInst;
  241. wc.hIcon=LoadIcon(m_hInst,TEXT(="">"Icon"));
  242. ="alt">wc.hCursor=LoadCursor(NULL,IDC_ARROW);
  243. wc.hbrBackground=(="datatypes">HBRUSH)(COLOR_WINDOW+1);
  244. ="alt">wc.lpszMenuName=MAKEINTRESOURCE(IDR_MENU1);
  245. wc.lpszClassName=TEXT(="">"MALLOC");
  246. ="alt">
  247. ="keyword">(!RegisterClass(&wc))
  248. ="alt">="keyword">FALSE;
  249. }
  250. ="alt">m_hWnd=CreateWindow(TEXT(="">"MALLOC"),TEXT(="">"IMallocObjectDemo"),
  251. WS_OVERLAPPEDWINDOW,35,35,350,250,NULL,NULL,m_hInst,="keyword">this);
  252. ="alt">
  253. ="keyword">(NULLm_hWnd)
  254. ="alt">{
  255. ="keyword">FALSE;
  256. ="alt">}
  257. ="alt">ShowWindow(m_hWnd,m_nCmdShow);
  258. UpdateWindow(m_hWnd);
  259. ="alt">
  260. ="keyword">TRUE;
  261. ="alt">}
  262. ="alt">="keyword">voidCAppVars::FreeAllocations(="datatypes">BOOLfRelease)
  263. {
  264. ="alt">="datatypes">UINTi;
  265. ="keyword">(NULLm_pIMalloc)
  266. ="alt">{
  267. ="keyword">;
  268. ="alt">}
  269. ="keyword">for(i=0;i<CALLOCS;i)
  270. ="alt">{
  271. ="keyword">(NULL!=m_rgpv[i])
  272. ="alt">m_pIMalloc->Free(m_rgpv[i]);
  273. m_rgpv[i]=NULL;
  274. ="alt">}
  275. ="keyword">(fRelease)
  276. ="alt">{
  277. m_pIMalloc->Release;
  278. ="alt">m_pIMalloc=NULL;
  279. }
  280. ="alt">}

任务型内存顺序大致如下:

CoGetMalloc(Task,...) 得到任务类型接口指针

Tags:  内存接口类型 内存接口 内存分配访问无效 内存分配

延伸阅读

最新评论

发表评论