借助
个Win32
展示了如何利用OLE
IMalloc接口来分配任务类型和共享类型
内存
运行画面如下:
源码MALLOC.H:
="highlighter-cpp">
="preprocessor">#ndef_MALLOC_H_
="alt">
="preprocessor">#
_MALLOC_H_
="alt">
="datatypes">LRESULT
PASCALMallocWndProc(="datatypes">HWND
,="datatypes">UINT
,="datatypes">WPARAM
,="datatypes">LPARAM
);
="alt">
="preprocessor">#
CALLOCS10
="comment">/*
="alt">
="comment">*Application
d
esandtypes.
="comment">*/
="alt">
="keyword">
CAppVars
{
="alt">
="keyword">friend
="datatypes">LRESULT
PASCALMallocWndProc(="datatypes">HWND
,="datatypes">UINT
,="datatypes">WPARAM
,="datatypes">LPARAM
);
="alt">
="keyword">protected
:
="datatypes">HINSTANCEm_hInst;
="alt">
="datatypes">HINSTANCE
m_hInstPrev;
="datatypes">UINTm_nCmdShow;
="alt">
="datatypes">HWND
m_hWnd;
LPMALLOCm_pIMalloc;
="alt">
="datatypes">BOOL
m_fInitialized;
="datatypes">ULONGm_rgcb[CALLOCS];="comment">//Sizestoallocate
="alt">
="datatypes">LPVOID
m_rgpv[CALLOCS];="comment">//Allocatedpo
ers
="alt">
="keyword">public
:
CAppVars(="datatypes">HINSTANCE,="datatypes">HINSTANCE,="datatypes">UINT);
="alt">
~CAppVars(="keyword">void
);
="datatypes">BOOLFInit(="keyword">void);
="alt">
="keyword">void
FreeAllocations(="datatypes">BOOL
);
};
="alt">
="keyword">typedefCAppVarsFAR*LPAPPVARS;
="alt">
="preprocessor">#CBWNDEXTRA(LONG)
="alt">
="preprocessor">#
MALLOCWL_STRUCTURE0
="alt">
="preprocessor">#end
//_MALLOC_H_
如下是MALLOC.CPP文件内容:
="highlighter-cpp">
="preprocessor">#<windows.h>
="alt">
="preprocessor">#
<ole2.h>
="preprocessor">#<initguid.h>
="alt">
="preprocessor">#
<ole2ver.h>
="preprocessor">#"malloc.h"
="alt">
="preprocessor">#
"resource.h"
="alt">
="datatypes">
PASCALWinMain(="datatypes">HINSTANCE
hInst,="datatypes">HINSTANCE
hInstPrev,="datatypes">LPSTR
pszCmdLine,="datatypes">
nCmdShow)
{
="alt">
MSGmsg;
LPAPPVARSpAV;
="alt">
="datatypes">
cMsg=96;
="preprocessor">#ndefWIN32
="alt">
="keyword">while
(!SetMessageQueue(cMsg)&&(cMsg-=8));
="preprocessor">#end
="alt">
pAV=="keyword">CAppVars(hInst,hInstPrev,nCmdShow);
="alt">
="keyword">(NULLpAV)
="alt">
{
="keyword">-1;
="alt">
}
="keyword">(pAV->FInit)
="alt">
{
="keyword">while(GetMessage(&msg,NULL,0,0))
="alt">
{
TranslateMessage(&msg);
="alt">
DispatchMessage(&msg);
}
="alt">
}
="keyword">deletepAV;
="alt">
="keyword">
msg.wParam;
}
="alt">
="datatypes">LRESULTPASCALMallocWndProc(="datatypes">HWNDhWnd,="datatypes">UINTiMsg,="datatypes">WPARAMwParam,="datatypes">LPARAMlParam)
="alt">
{
LPAPPVARSpAV;
="alt">
="datatypes">LPVOID
pv;
="datatypes">ULONGcb;
="alt">
="datatypes">UINT
i;
="datatypes">BOOLfResult=TRUE;
="alt">
="datatypes">HRESULT
hr;
="alt">
pAV=(LPAPPVARS)GetWindowLong(hWnd,MALLOCWL_STRUCTURE);
="alt">
="keyword">switch
(iMsg)
{
="alt">
="keyword">
WM_NCCREATE:
pAV=(LPAPPVARS)((="datatypes">LONG)((LPCREATESTRUCT)lParam)->lpCreateParams);
="alt">
SetWindowLong(hWnd,MALLOCWL_STRUCTURE,(="datatypes">LONG
)pAV);
="keyword">(DefWindowProc(hWnd,iMsg,wParam,lParam));
="alt">
="keyword">WM_DESTROY:
="alt">
PostQuitMessage(0);
="keyword">;
="alt">
="keyword">WM_COMMAND:
="alt">
="keyword">switch
(LOWORD(wParam))
{
="alt">
="keyword">
IDM_IMALLOCCOGETMALLOCTASK:
pAV->FreeAllocations(TRUE);
="alt">
hr=CoGetMalloc(MEMCTX_TASK,&pAV->m_pIMalloc);
fResult=SUCCEEDED(hr);
="alt">
MessageBox(hWnd,((fResult)?TEXT(="
">"CoGetMalloc(task)succeeded."
):TEXT(="
">"CoGetMalloc(task)failed."
)),
TEXT(="">"MALLOC"),MB_OK);
="alt">
="keyword">
;
="alt">
="keyword">
IDM_IMALLOCCOGETMALLOCSHARED:
pAV->FreeAllocations(TRUE);
="alt">
hr=CoGetMalloc(MEMCTX_SHARED,&pAV->m_pIMalloc);
fResult=SUCCEEDED(hr);
="alt">
MessageBox(hWnd,((fResult)?TEXT(="
">"CoGetMalloc(shared)succeeded."
):TEXT(="
">"CoGetMalloc(shared)failed."
)),
TEXT(="">"MALLOC"),MB_OK);
="alt">
="keyword">
;
="alt">
="keyword">
IDM_IMALLOCRELEASE:
pAV->FreeAllocations(TRUE);
="alt">
MessageBox(hWnd,TEXT(="
">"IMalloc::Releasefinished."
),TEXT(="
">"Malloc"
),MB_OK);
="keyword">;
="alt">
="keyword">IDM_IMALLOCALLOC:
="alt">
="keyword">
(NULLpAV->m_pIMalloc)
="keyword">;
="alt">
pAV->FreeAllocations(FALSE);
="keyword">for(i=0;i<CALLOCS;i)
="alt">
{
="datatypes">LPBYTEpb;
="alt">
="datatypes">ULONG
iByte;
cb=pAV->m_rgcb[i];
="alt">
pAV->m_rgpv[i]=pAV->m_pIMalloc->Alloc(cb);
="comment">//Fillthememorywithletters
="alt">
pb=(="datatypes">LPBYTE
)pAV->m_rgpv[i];
="alt">
="keyword">
(NULL!=pb)
{
="alt">
="keyword">for
(iByte=0;iByte<cb;iByte)
{
="alt">
*pb+(="
">'a'
+i);
}
="alt">
}
fResult&=(NULL!=pAV->m_rgpv[i]);
="alt">
}
MessageBox(hWnd,((fResult)?TEXT(="">"IMalloc::Allocsucceeded."):TEXT(="">"IMalloc::Allocfailed.")),
="alt">
TEXT(="
">"MALLOC"
),MB_OK);
="keyword">;
="alt">
="keyword">IDM_IMALLOCFREE:
="alt">
pAV->FreeAllocations(FALSE);
MessageBox(hWnd,TEXT(="">"IMalloc::Freefinished."),TEXT(="">"Malloc"),MB_OK);
="alt">
="keyword">
;
="alt">
="keyword">
IDM_IMALLOCREALLOC:
="keyword">(NULLpAV->m_pIMalloc)
="alt">
="keyword">
;
="keyword">for(i=0;i<CALLOCS;i)
="alt">
{
="datatypes">LPBYTEpb;
="alt">
="datatypes">ULONG
iByte;
pAV->m_rgcb[i]128;
="alt">
pv=pAV->m_pIMalloc->Realloc(pAV->m_rgpv[i],pAV->m_rgcb[i]);
="keyword">(NULL!=pv)
="alt">
{
pAV->m_rgpv[i]=pv;
="alt">
="comment">//Fillthe
memorywithsomethingwecansee.
pb=(="datatypes">LPBYTE)pAV->m_rgpv[i];
="alt">
cb=pAV->m_rgcb[i];
="keyword">(NULL!=pb)
="alt">
{
="keyword">for(iByte=cb-128;iByte<cb;iByte)
="alt">
{
*pb+(="">'a'+i);
="alt">
}
}
="alt">
}
="keyword">
="alt">
{
fResult=FALSE;
="alt">
}
}
="alt">
MessageBox(hWnd,((fResult)?TEXT(="
">"IMalloc::Reallocsucceeded."
):TEXT(="
">"IMalloc::Reallocfailed."
)),
TEXT(="">"Malloc"),MB_OK);
="alt">
="keyword">
;
="alt">
="keyword">
IDM_IMALLOCGETSIZE:
="keyword">(NULLpAV->m_pIMalloc)
="alt">
{
="keyword">;
="alt">
}
="keyword">for(i=0;i<CALLOCS;i)
="alt">
{
cb=pAV->m_pIMalloc->GetSize(pAV->m_rgpv[i]);
="alt">
="comment">/*
="comment">*Wetestthatthesizeisatleastwhatwewanted.
="alt">
="comment">*/
fResult&=(pAV->m_rgcb[i]<=cb);
="alt">
}
MessageBox(hWnd,((fResult)?TEXT(="">"IMalloc::GetSizematched."):TEXT(="">"IMalloc::GetSizemismatch.")),
="alt">
TEXT(="
">"Malloc"
),MB_OK);
="keyword">;
="alt">
="keyword">IDM_IMALLOCDIDALLOC:
="alt">
="keyword">
(NULLpAV->m_pIMalloc)
="keyword">;
="alt">
="comment">/*
="comment">*DidAllocmay-1itdoesnotknow
="alt">
="comment">*itactuallyallocatedsomething.Inthat
,
="comment">*wejustblindly&ina-1withnoeffect.
="alt">
="comment">*/
="keyword">for(i=0;i<CALLOCS;i)
="alt">
{
fResult&=pAV->m_pIMalloc->DidAlloc(pAV->m_rgpv[i]);
="alt">
}
MessageBox(hWnd,((fResult)?TEXT(="">"IMalloc::DidAllocisTRUE."):TEXT(="">"IMalloc::DidAllocisFALSE.")),
="alt">
TEXT(="
">"IMalloc"
),MB_OK);
="keyword">;
="alt">
="keyword">IDM_IMALLOCHEAPMINIMIZE:
="alt">
="keyword">
(NULL!=pAV->m_pIMalloc)
{
="alt">
pAV->m_pIMalloc->HeapMinimize;
}
="alt">
MessageBox(hWnd,TEXT(="
">"IMalloc::HeapMinimizefinished."
),TEXT(="
">"Malloc"
),MB_OK);
="keyword">;
="alt">
="keyword">IDM_IMALLOCEXIT:
="alt">
PostMessage(hWnd,WM_CLOSE,0,0L);
="keyword">;
="alt">
}
="keyword">;
="alt">
="keyword">default:
="alt">
="keyword">
(DefWindowProc(hWnd,iMsg,wParam,lParam));
}
="alt">
="keyword">
0L;
}
="alt">
CAppVars::CAppVars(="datatypes">HINSTANCEhInst,="datatypes">HINSTANCEhInstPrev,="datatypes">UINTnCmdShow)
="alt">
{
="datatypes">UINTi;
="alt">
="datatypes">ULONG
cb;
="alt">
="comment">//InitializeWinMainparameterholders.
m_hInst=hInst;
="alt">
m_hInstPrev=hInstPrev;
m_nCmdShow=nCmdShow;
="alt">
m_hWnd=NULL;
m_pIMalloc=NULL;
="alt">
m_fInitialized=FALSE;
="alt">
="comment">//100isarbitrary.IMalloccanhandlelarger.
cb=100;
="alt">
="keyword">for
(i=0;i<CALLOCS;i)
{
="alt">
m_rgcb[i]=cb;
m_rgpv[i]=NULL;
="alt">
cb*=2;
}
="alt">
="keyword">
;
}
="alt">
CAppVars::~CAppVars(="keyword">void)
="alt">
{
FreeAllocations(TRUE);
="alt">
="comment">//freetheenumeratorobject
wehaveone.
="keyword">(m_fInitialized)
="alt">
{
CoUninitialize;
="alt">
}
="keyword">;
="alt">
}
="alt">
="datatypes">BOOL
CAppVars::FInit
{
="alt">
WNDCLASSwc;
="datatypes">DWORDdwVer;
="alt">
="comment">//MakesureCOMPOBJ.DLListherightversion
="alt">
dwVer=CoBuildVersion;
="keyword">(rmm!=HIWORD(dwVer))
="alt">
="keyword">
FALSE;
="alt">
="comment">//CallCoInitializesothatwecancallotherCo...functions
="keyword">(FAILED(CoInitialize(NULL)))
="alt">
="keyword">
FALSE;
="alt">
m_fInitialized=TRUE;
="alt">
="keyword">
(!m_hInstPrev)
{
="alt">
wc.style=CS_HREDRAW|CS_VREDRAW;
wc.lpfnWndProc=MallocWndProc;
="alt">
wc.cbClsExtra=0;
wc.cbWndExtra=CBWNDEXTRA;
="alt">
wc.hInstance=m_hInst;
wc.hIcon=LoadIcon(m_hInst,TEXT(="">"Icon"));
="alt">
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(="datatypes">HBRUSH)(COLOR_WINDOW+1);
="alt">
wc.lpszMenuName=MAKEINTRESOURCE(IDR_MENU1);
wc.lpszClassName=TEXT(="">"MALLOC");
="alt">
="keyword">(!RegisterClass(&wc))
="alt">
="keyword">
FALSE;
}
="alt">
m_hWnd=CreateWindow(TEXT(="
">"MALLOC"
),TEXT(="
">"IMallocObjectDemo"
),
WS_OVERLAPPEDWINDOW,35,35,350,250,NULL,NULL,m_hInst,="keyword">this);
="alt">
="keyword">(NULLm_hWnd)
="alt">
{
="keyword">FALSE;
="alt">
}
="alt">
ShowWindow(m_hWnd,m_nCmdShow);
UpdateWindow(m_hWnd);
="alt">
="keyword">TRUE;
="alt">
}
="alt">
="keyword">void
CAppVars::FreeAllocations(="datatypes">BOOL
fRelease)
{
="alt">
="datatypes">UINT
i;
="keyword">(NULLm_pIMalloc)
="alt">
{
="keyword">;
="alt">
}
="keyword">for(i=0;i<CALLOCS;i)
="alt">
{
="keyword">(NULL!=m_rgpv[i])
="alt">
m_pIMalloc->Free(m_rgpv[i]);
m_rgpv[i]=NULL;
="alt">
}
="keyword">(fRelease)
="alt">
{
m_pIMalloc->Release;
="alt">
m_pIMalloc=NULL;
}
="alt">
}
任务型内存
顺序大致如下:
CoGetMalloc(Task,...)
得到任务类型接口指针
延伸阅读
最新评论