借助
![](/icons/41119yi.gif)
个Win32
![](/icons/41119chengxu.gif)
展示了如何利用OLE
![](/icons/41119de.gif)
IMalloc接口来分配任务类型和共享类型
![](/icons/41119de.gif)
内存
![](/icons/41119chengxu.gif)
运行画面如下:
源码MALLOC.H:
="highlighter-cpp">
="preprocessor">#
ndef_MALLOC_H_
="alt">
="preprocessor">#
![](/icons/41119define.gif)
_MALLOC_H_
="alt">
="datatypes">LRESULT
PASCALMallocWndProc(="datatypes">HWND
,="datatypes">UINT
,="datatypes">WPARAM
,="datatypes">LPARAM
);
="alt">
="preprocessor">#
![](/icons/41119define.gif)
CALLOCS10
="comment">/*
="alt">
="comment">*Application
![](/icons/41119define.gif)
d
![](/icons/41119class.gif)
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
![](/icons/41119int.gif)
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">#
![](/icons/41119define.gif)
MALLOCWL_STRUCTURE0
="alt">
="preprocessor">#end
![](/icons/41119if.gif)
//_MALLOC_H_
如下是MALLOC.CPP文件内容:
="highlighter-cpp">
="preprocessor">#
<windows.h>
="alt">
="preprocessor">#
![](/icons/41119include.gif)
<ole2.h>
="preprocessor">#
<initguid.h>
="alt">
="preprocessor">#
![](/icons/41119include.gif)
<ole2ver.h>
="preprocessor">#
"malloc.h"
="alt">
="preprocessor">#
![](/icons/41119include.gif)
"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">
(NULL
pAV)
="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(="
![](/icons/41119string.gif)
">"CoGetMalloc(task)succeeded."
):TEXT(="
![](/icons/41119string.gif)
">"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(="
![](/icons/41119string.gif)
">"CoGetMalloc(shared)succeeded."
):TEXT(="
![](/icons/41119string.gif)
">"CoGetMalloc(shared)failed."
)),
TEXT(="
">"MALLOC"),MB_OK);
="alt">
="keyword">
;
="alt">
="keyword">
IDM_IMALLOCRELEASE:
pAV->FreeAllocations(TRUE);
="alt">
MessageBox(hWnd,TEXT(="
![](/icons/41119string.gif)
">"IMalloc::Releasefinished."
),TEXT(="
![](/icons/41119string.gif)
">"Malloc"
),MB_OK);
="keyword">
;
="alt">
="keyword">
IDM_IMALLOCALLOC:
="alt">
="keyword">
(NULL
pAV->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+
(="
![](/icons/41119string.gif)
">'a'
+i);
}
="alt">
}
fResult&=(NULL!=pAV->m_rgpv[i]);
="alt">
}
MessageBox(hWnd,((fResult)?TEXT(="
">"IMalloc::Allocsucceeded."):TEXT(="
">"IMalloc::Allocfailed.")),
="alt">
TEXT(="
![](/icons/41119string.gif)
">"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">
(NULL
pAV->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
![](/icons/41119new.gif)
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(="
![](/icons/41119string.gif)
">"IMalloc::Reallocsucceeded."
):TEXT(="
![](/icons/41119string.gif)
">"IMalloc::Reallocfailed."
)),
TEXT(="
">"Malloc"),MB_OK);
="alt">
="keyword">
;
="alt">
="keyword">
IDM_IMALLOCGETSIZE:
="keyword">
(NULL
pAV->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(="
![](/icons/41119string.gif)
">"Malloc"
),MB_OK);
="keyword">
;
="alt">
="keyword">
IDM_IMALLOCDIDALLOC:
="alt">
="keyword">
(NULL
pAV->m_pIMalloc)
="keyword">
;
="alt">
="comment">/*
="comment">*DidAllocmay
-1
itdoesnotknow
="alt">
="comment">*itactuallyallocatedsomething.Inthat
![](/icons/41119case.gif)
,
="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(="
![](/icons/41119string.gif)
">"IMalloc"
),MB_OK);
="keyword">
;
="alt">
="keyword">
IDM_IMALLOCHEAPMINIMIZE:
="alt">
="keyword">
(NULL!=pAV->m_pIMalloc)
{
="alt">
pAV->m_pIMalloc->HeapMinimize
;
}
="alt">
MessageBox(hWnd,TEXT(="
![](/icons/41119string.gif)
">"IMalloc::HeapMinimizefinished."
),TEXT(="
![](/icons/41119string.gif)
">"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
![](/icons/41119if.gif)
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(="
![](/icons/41119string.gif)
">"MALLOC"
),TEXT(="
![](/icons/41119string.gif)
">"IMallocObjectDemo"
),
WS_OVERLAPPEDWINDOW,35,35,350,250,NULL,NULL,m_hInst,="keyword">this);
="alt">
="keyword">
(NULL
m_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">
(NULL
m_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">
}
任务型内存
![](/icons/41119diaoyong.gif)
顺序大致如下:
CoGetMalloc(Task,...)
得到任务类型接口指针
延伸阅读
最新评论