這個(gè)的確還是挺頭疼的。前一階段同學(xué)告訴我,很不幸,今天又給忘了。
查了一下,再根據(jù)模糊記憶,還是把方框打上了對(duì)勾。
可能你也有這樣的煩惱,不妨我們來看一下:
在word字體中選擇Wingdings2,然后寫一個(gè)大寫R,這樣你就看到方框打?qū)戳恕?br>
好記性真不如爛筆頭,占此一角,記錄一下。
Windows mobile 中 outlook 中任務(wù),約會(huì),聯(lián)系人,在調(diào)用時(shí),有相應(yīng)的database oid
對(duì)應(yīng)的database oid 不是很清楚,我通過實(shí)驗(yàn),發(fā)現(xiàn),任務(wù)是13, 約會(huì)是9, 聯(lián)系人是10.
那有沒有專門的數(shù)值對(duì)應(yīng)呢?查了一下,發(fā)現(xiàn)這么個(gè)東東:
typedef /* [v1_enum] */
enum OlDefaultFolders
{ olFolderCalendar = 9,
olFolderContacts = 10,
olFolderTasks = 13,
olFolderCities = 101,
olFolderInfrared = 102,
} OlDefaultFolders;
和我們的實(shí)驗(yàn)數(shù)據(jù)一樣.
不錯(cuò)吧.
最近在搞一個(gè)小東東,
里面涉及到了DATE和SYSTEMTIME的轉(zhuǎn)換,沒有用到過,記錄一下.
DATE 轉(zhuǎn)換成SYSTEMTIME VariantTimeToSystemTime
其原型為:
INT VariantTimeToSystemTime(
double vtime, LPSYSTEMTIME lpSystemTime ); SYSTEMTIME轉(zhuǎn)換成DATE
SystemTimeToVariantTime
其原型為:
INT SystemTimeToVariantTime(
LPSYSTEMTIME lpSystemTime,
double *pvtime );
今天調(diào)試安裝文件的對(duì)話框,橫屏的時(shí)候,Edit框的顯示,總會(huì)隨著滾動(dòng)條往上移動(dòng),下面顯示出一大片的空白。
很是郁悶啊……
在代碼中修改了很長(zhǎng)時(shí)間,找不出原因,最后和別人代碼比對(duì)的時(shí)候,發(fā)現(xiàn)我竟然是在資源文件中的對(duì)話框?qū)傩远x中比別人多一個(gè)WS_BORDER屬性,問題迎刃而解。
但究其原因,還不是很清楚。
WS_BORDER: Create a window that has a border.
似乎也看不出來什么原因。
在Windows Mobile中,Edit控件在具有WS_VSCROLL的時(shí)候,無論顯示文字的多少,都會(huì)顯示滾動(dòng)條。如何在顯示文字不到一頁(yè)的情況下,讓滾動(dòng)條不顯示呢?
我是這樣考慮的:判斷顯示文字的高度,即顯示文字的行數(shù)*單個(gè)文字的高度,判斷其是否大于屏幕高度,如果大于,則改變Edit控件的屬性,使其具有WS_VSCROLL屬性;如果小于或等于,則改變Edit控件的屬性,使其不具有WS_VSCROLL屬性。
代碼示例:
int height = GetSystemMetrics(SM_CYFULLSCREEN); // 此處示屏幕高度,可自己設(shè)定
HWND hEdit = GetDlgItem(hDlg, IDC_EDIT);
DWORD dwLineCount = (DWORD)::SendMessage(hEdit, EM_GETLINECOUNT, 0, 0L);
HDC hdc = GetDC(hDlg);
TEXTMETRIC metric;
GetTextMetrics(hdc, &metric);
ReleaseDC(hDlg, hdc);
if (metric.tmHeight * dwLineCount <= height))
{
SetWindowLong(hEdit, GWL_STYLE, WS_VISIBLE | ES_MULTILINE | ES_READONLY);
}
else
{
SetWindowLong(hEdit,GWL_STYLE, WS_VISIBLE| WS_VSCROLL| ES_MULTILINE |ES_READONLY);
}
我在創(chuàng)建Edit控件的時(shí)候,一開始沒有設(shè)置WS_VSCROLL屬性,發(fā)現(xiàn)加上WS_VSCROLL屬性后,對(duì)于按鍵的上下響應(yīng)有些問題。后來就反其道而行之,先讓其具有WS_VSCROLL屬性,然后再判斷其是否該顯示滾動(dòng)條。
在Windows Mobile中涉及到橫豎屏切換的問題,比如說,在豎屏的時(shí)候沒有滾動(dòng)條,到橫屏的時(shí)候又需要有滾動(dòng)條,此時(shí)怎么辦?
在WM_SIZE中進(jìn)行以上的屬性判斷,但是有一個(gè)問題需要注意:如果需要調(diào)整Edit控件的大小,需要在屬性判斷置后進(jìn)行。
一點(diǎn)心得,大家可以試試哈!
Why is everyone in such a rush?
Walk into any bookstore, and you'll see how to Teach Yourself Java in 7 Days alongside endless variations offering to teach Visual Basic, Windows, the Internet, and so on in a few days or hours. I did the following power search at Amazon.com:
pubdate: after 1992 and title: days and
(title: learn or title: teach yourself)
and got back 248 hits. The first 78 were computer books (number 79 was Learn Bengali in 30 days). I replaced "days" with "hours" and got remarkably similar results: 253 more books, with 77 computer books followed by Teach Yourself Grammar and Style in 24 Hours at number 78. Out of the top 200 total, 96% were computer books.
The conclusion is that either people are in a big rush to learn about computers, or that computers are somehow fabulously easier to learn than anything else. There are no books on how to learn Beethoven, or Quantum Physics, or even Dog Grooming in a few days.
Let's analyze what a title like Learn Pascal in Three Days could mean:
Learn: In 3 days you won't have time to write several significant programs, and learn from your successes and failures with them. You won't have time to work with an experienced programmer and understand what it is like to live in that environment. In short, you won't have time to learn much. So they can only be talking about a superficial familiarity, not a deep understanding. As Alexander Pope said, a little learning is a dangerous thing.
Pascal: In 3 days you might be able to learn the syntax of Pascal (if you already knew a similar language), but you couldn't learn much about how to use the syntax. In short, if you were, say, a Basic programmer, you could learn to write programs in the style of Basic using Pascal syntax, but you couldn't learn what Pascal is actually good (and bad) for. So what's the point? Alan Perlis once said: "A language that doesn't affect the way you think about programming, is not worth knowing". One possible point is that you have to learn a tiny bit of Pascal (or more likely, something like Visual Basic or javascript) because you need to interface with an existing tool to accomplish a specific task. But then you're not learning how to program; you're learning to accomplish that task.
in Three Days: Unfortunately, this is not enough, as the next section shows.
Teach Yourself Programming in Ten Years
Researchers (Hayes, Bloom) have shown it takes about ten years to develop expertise in any of a wide variety of areas, including chess playing, music composition, painting, piano playing, swimming, tennis, and research in neuropsychology and topology. There appear to be no real shortcuts: even Mozart, who was a musical prodigy at age 4, took 13 more years before he began to produce world-class music. In another genre, the Beatles seemed to burst onto the scene, appearing on the Ed Sullivan show in 1964. But they had been playing since 1957, and while they had mass appeal early on, their first great critical success, Sgt. Peppers, was released in 1967. Samuel Johnson thought it took longer than ten years: "Excellence in any department can be attained only by the labor of a lifetime; it is not to be purchased at a lesser price." And Chaucer complained "the lyf so short, the craft so long to lerne."
Here's my recipe for programming success:
Get interested in programming, and do some because it is fun. Make sure that it keeps being enough fun so that you will be willing to put in ten years.
Talk to other programmers; read other programs. This is more important than any book or training course.
Program. The best kind of learning is learning by doing. To put it more technically, "the maximal level of performance for individuals in a given domain is not attained automatically as a function of extended experience, but the level of performance can be increased even by highly experienced individuals as a result of deliberate efforts to improve." (p. 366) and "the most effective learning requires a well-defined task with an appropriate difficulty level for the particular individual, informative feedback, and opportunities for repetition and corrections of errors." (p. 20-21) The book Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life is an interesting reference for this viewpoint.
If you want, put in four years at a college (or more at a graduate school). This will give you access to some jobs that require credentials, and it will give you a deeper understanding of the field, but if you don't enjoy school, you can (with some dedication) get similar experience on the job. In any case, book learning alone won't be enough. "Computer science education cannot make anybody an expert programmer any more than studying brushes and pigment can make somebody an expert painter" says Eric Raymond, author of The New Hacker's Dictionary. One of the best programmers I ever hired had only a High School degree; he's produced a lot of great software, has his own news group, and through stock options is no doubt much richer than I'll ever be.
Work on projects with other programmers. Be the best programmer on some projects; be the worst on some others. When you're the best, you get to test your abilities to lead a project, and to inspire others with your vision. When you're the worst, you learn what the masters do, and you learn what they don't like to do (because they make you do it for them).
Work on projects after other programmers. Be involved in understanding a program written by someone else. See what it takes to understand and fix it when the original programmers are not around. Think about how to design your programs to make it easier for those who will maintain it after you.
Learn at least a half dozen programming languages. Include one language that supports class abstractions (like Java or C++), one that supports functional abstraction (like Lisp or ML), one that supports syntactic abstraction (like Lisp), one that supports declarative specifications (like Prolog or C++ templates), one that supports coroutines (like Icon or Scheme), and one that supports parallelism (like Sisal).
Remember that there is a "computer" in "computer science". Know how long it takes your computer to execute an instruction, fetch a word from memory (with and without a cache miss), read consecutive words from disk, and seek to a new location on disk. (Answers here.)
Get involved in a language standardization effort. It could be the ANSI C++ committee, or it could be deciding if your local coding style will have 2 or 4 space indentation levels. Either way, you learn about what other people like in a language, how deeply they feel so, and perhaps even a little about why they feel so.
Have the good sense to get off the language standardization effort as quickly as possible.
With all that in mind, its questionable how far you can get just by book learning. Before my first child was born, I read all the How To books, and still felt like a clueless novice. 30 Months later, when my second child was due, did I go back to the books for a refresher? No. Instead, I relied on my personal experience, which turned out to be far more useful and reassuring to me than the thousands of pages written by experts.
Fred Brooks, in his essay No Silver Bullets identified a three-part plan for finding great software designers:
Systematically identify top designers as early as possible.
Assign a career mentor to be responsible for the development of the prospect and carefully keep a career file.
Provide opportunities for growing designers to interact and stimulate each other.
This assumes that some people already have the qualities necessary for being a great designer; the job is to properly coax them along. Alan Perlis put it more succinctly: "Everyone can be taught to sculpt: Michelangelo would have had to be taught how not to. So it is with the great programmers".
So go ahead and buy that Java book; you'll probably get some use out of it. But you won't change your life, or your real overall expertise as a programmer in 24 hours, days, or even months.
References
Bloom, Benjamin (ed.) Developing Talent in Young People, Ballantine, 1985.
Brooks, Fred, No Silver Bullets, IEEE Computer, vol. 20, no. 4, 1987, p. 10-19.
Hayes, John R., Complete Problem Solver Lawrence Erlbaum, 1989.
Lave, Jean, Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life, Cambridge University Press, 1988.
http://www.norvig.com/
昨天才開始認(rèn)真讀《小P成長(zhǎng)記》,發(fā)現(xiàn)真的很好看。
學(xué)習(xí)這么久,才發(fā)現(xiàn)思考方法的轉(zhuǎn)變還是很重要的。我們往往缺少一位向老C一樣的好老師,能夠慢慢引導(dǎo)我們學(xué)習(xí)。
機(jī)會(huì)難得,我們與小P一樣快快成長(zhǎng)吧。
讀到第一桶第九碗了,
對(duì)里面的一些思想和方法很贊同,轉(zhuǎn)過來:
思想:1. 以數(shù)據(jù)為中心思考問題的解決之道。2. 將對(duì)同類數(shù)據(jù)的操作放在相同的編譯單元中。3. 信息隱藏,而不是暴露,以將問題的規(guī)??刂圃诳衫斫獾姆秶?。方法:1. 首先關(guān)注整體,而不是細(xì)節(jié)。2. 先考慮測(cè)試,更先于編碼。3. 先用偽代碼編程,以體現(xiàn)程序的意圖,再用具體代碼完善之。4. 迅速構(gòu)建可編譯通過的,并且可執(zhí)行的框架程序,使用測(cè)試代碼測(cè)試之。5. 將以上方法反復(fù)應(yīng)用于子模塊,直到問題被解決。6. 在上下文環(huán)境中提取對(duì)其他模塊的需求。7. 先寫.h文件,后寫.c文件。8. 先快速實(shí)現(xiàn)一個(gè)可行的解法,再根據(jù)反饋信息優(yōu)化之。
如果大家也關(guān)心小P,就一同到那看看,鏈接地址:
http://www.shnenglu.com/enderson/archive/2009/02/18/74215.html
今天在項(xiàng)目中遇到了一個(gè)問題:在smartphone上獲取進(jìn)程地址不成功,而在pocket pc上卻可以獲取成功。研究了一下,這是跟smartphone上的安全機(jī)制有關(guān),需要對(duì)我們的應(yīng)用程序進(jìn)行簽名。
開發(fā)的時(shí)候利用數(shù)字簽名就可以解決。
開發(fā)的時(shí)候,在Project->Property->Configuration Properties->Authenticode Signing中需要加載開發(fā)安全證書。
這樣我們就可以很方便的獲得進(jìn)程的路徑
TCHAR szPath[MAX_PATH];
HANDLE hProcess = OpenProcess(0, FALSE, pe.th32ProcessID);
GetModuleFileName((HMODULE)hProcess, szPath, sizeof(szPath));
CloseHandle(hProcess);
如果hProcess為NULL的話,獲取的是當(dāng)前進(jìn)程的路徑。
所以開發(fā)SmartPhone時(shí)需要注意這點(diǎn)。涉及特權(quán)API了,就需要簽名了。
最近在工作中遇到一個(gè)比較怪異的現(xiàn)象,在某些省區(qū)與SP的短信交互存在問題,短信發(fā)送不出去。查了一下原因:SmsSendMessage參數(shù)設(shè)置的問題。
在Windows Mobile 5.0SDK的HelloSMS例子中,發(fā)送短信的代碼是這樣寫的
void SendSMS(BOOL bSendConfirmation, BOOL bUseDefaultSMSC, LPCTSTR lpszSMSC, LPCTSTR lpszRecipient, LPCTSTR lpszMessage)


{
SMS_HANDLE smshHandle;
SMS_ADDRESS smsaSource;
SMS_ADDRESS smsaDestination;
TEXT_PROVIDER_SPECIFIC_DATA tpsd;
SMS_MESSAGE_ID smsmidMessageID;

// try to open an SMS Handle
if(FAILED(SmsOpen(SMS_MSGTYPE_TEXT, SMS_MODE_SEND, &smshHandle, NULL)))

{
MessageBox(NULL,
(LPCTSTR)LoadString(ghInstance, IDS_ERROR_SMSOPEN, 0, 0),
(LPCTSTR)LoadString(ghInstance, IDS_CAPTION_ERROR, 0, 0),
MB_OK | MB_ICONERROR);
return;
}

// Create the source address
if(!bUseDefaultSMSC)

{
smsaSource.smsatAddressType = SMSAT_INTERNATIONAL;
_tcsncpy(smsaSource.ptsAddress, lpszSMSC, SMS_MAX_ADDRESS_LENGTH);
}

// Create the destination address
smsaDestination.smsatAddressType = SMSAT_INTERNATIONAL;
_tcsncpy(smsaDestination.ptsAddress, lpszRecipient, SMS_MAX_ADDRESS_LENGTH);

// Set up provider specific data
memset(&tpsd, 0, sizeof(tpsd));
tpsd.dwMessageOptions = bSendConfirmation ? PS_MESSAGE_OPTION_STATUSREPORT : PS_MESSAGE_OPTION_NONE;
tpsd.psMessageClass = PS_MESSAGE_CLASS1;
tpsd.psReplaceOption = PSRO_NONE;
tpsd.dwHeaderDataSize = 0;

// Send the message, indicating success or failure
if(SUCCEEDED(SmsSendMessage(smshHandle, ((bUseDefaultSMSC) ? NULL : &smsaSource),
&smsaDestination, NULL, (PBYTE) lpszMessage,
_tcslen(lpszMessage) * sizeof(TCHAR), (PBYTE) &tpsd,
sizeof(TEXT_PROVIDER_SPECIFIC_DATA), SMSDE_OPTIMAL,
SMS_OPTION_DELIVERY_NONE, &smsmidMessageID)))

{
MessageBox(NULL,
(LPCTSTR)LoadString(ghInstance, IDS_SMSSENT, 0, 0),
(LPCTSTR)LoadString(ghInstance, IDS_CAPTION_SUCCESS, 0, 0),
MB_OK);
}
else

{
MessageBox(NULL,
(LPCTSTR)LoadString(ghInstance, IDS_ERROR_SMSSEND, 0, 0),
(LPCTSTR)LoadString(ghInstance, IDS_CAPTION_ERROR, 0, 0),
MB_OK | MB_ICONERROR);
}

// clean up
VERIFY(SUCCEEDED(SmsClose(smshHandle)));
}

這段代碼在一般情況下是運(yùn)行正確的,對(duì)于手機(jī)與手機(jī)的發(fā)送是不存在問題的,但是與SP的交互在某些省區(qū)就存在短信發(fā)送不出去的情況。
為了更好的理解這段代碼,我們先來熟悉一下SmsSendMessage及各個(gè)參數(shù)。
SmsSendMessage
功能:Use the SmsSendMessage function to create and send an Short Message Service (SMS) message.(創(chuàng)建和發(fā)送短信,但短信發(fā)送后并不保存到發(fā)件箱中)
原型:
HRESULT SmsSendMessage (
const SMS_HANDLE smshHandle, // 調(diào)用SmsOpen時(shí)獲得的短信句柄
const SMS_ADDRESS * const psmsaSMSCAddress, //指向短信中心號(hào)碼的地址
const SMS_ADDRESS * const psmsaDestinationAddress, // 發(fā)送的目的地址
const SYSTEMTIME * const pstValidityPeriod, // 發(fā)送時(shí)間的有效期
const BYTE * const pbData, // 信息的內(nèi)容部分
const DWORD dwDataSize,// 信息內(nèi)容的長(zhǎng)度
const BYTE * const pbProviderSpecificData, //運(yùn)營(yíng)商的附加數(shù)據(jù)
const DWORD dwProviderSpecificDataSize, // 附加數(shù)據(jù)的長(zhǎng)度
const SMS_DATA_ENCODING smsdeDataEncoding, // 短信編碼
const DWORD dwOptions, // 其他選項(xiàng)
SMS_MESSAGE_ID * psmsmidMessageID); // 用于得到系統(tǒng)回執(zhí)的信息
(具體介紹可查看http://msdn.microsoft.com/en-us/library/aa455068.aspx)
在實(shí)際應(yīng)用中短信發(fā)送不出去,但是SmsSendMessage的返回值是S_OK值。在一些文章中有人這樣認(rèn)為是短信編碼的問題造成的。
如果編碼格式不對(duì)可能造成短信中心網(wǎng)關(guān)把短信給吞掉的情況,程序雖然調(diào)用成功,但是就是目標(biāo)號(hào)碼收不到短信。函數(shù)參數(shù)中的后三個(gè)參數(shù)可以不用或設(shè)默認(rèn)值都可以。
起初我也是認(rèn)為這個(gè)地方造成的,很是興奮。短信的回復(fù)內(nèi)容恰為字母,我誤以為短信內(nèi)容此時(shí)是7-BIT的短消息,短信網(wǎng)關(guān)把短信給吞掉了,造成目標(biāo)號(hào)碼收不到短信。在練習(xí)中卻也陰差陽(yáng)錯(cuò)的成功了。很高興的把理由歸到了這個(gè)地方。并這樣總結(jié):SmsSendMessage可以支持7-bit的ASCII碼的短消息,也支持16-bit的unicode的短消息。但內(nèi)容為ASCII的時(shí)候,短信編碼為 SMSDE_GSM或SMSDE_OPTIMAL,當(dāng)內(nèi)容不全是ASCII的時(shí)候,短信編碼為SMSDE_GSM或SMSDE_OPTIMAL。所以回復(fù)內(nèi)容改為漢字即可。
但是這樣對(duì)么?起初我認(rèn)為我的解釋很合理.但是我卻發(fā)現(xiàn)我的一個(gè)參數(shù)與原來的程序不一樣.
是我在嘗試中無意修改了一個(gè)參數(shù),將
tpsd.psMessageClass = PS_MESSAGE_CLASS1;
修改為了
tpsd.psMessageClass = PS_MESSAGE_CLASSUNSPECIFIED;
這是發(fā)送短信中的運(yùn)營(yíng)商的指定數(shù)據(jù)TEXT_PROVIDER_SPECIFIC_DATA,它的參數(shù)psMessageClass是指
Text Short Message Service (SMS) messages with the appropriate flag can replace previously received notifications with a similar flag and originating address.
它有以下五個(gè)值:
PS_MESSAGE_CLASS0: The message should be displayed immediately but not stored. The MS shall send an acknowledgement to the service center when the message has successfully reached the MS. (被接受后立即顯示但不存儲(chǔ)(稱為閃信)。需要向SMSC發(fā)送確認(rèn)信息。)
PS_MESSAGE_CLASS1:The message should be stored and an acknowledgement should be sent to the Service Center when it is stored.(接收后被存儲(chǔ),一旦存儲(chǔ),需要向SMSC發(fā)送確認(rèn)信息。)
PS_MESSAGE_CLASS2:The message should be transferred to the SMS data field in the subscriber identity module (SIM) before an acknowledgement is sent to the Service Center.
PS_MESSAGE_CLASS3:When the message has successfully reached the destination and can be stored, an acknowledgement is sent to the Service Center.
PS_MESSAGE_CLASSUNSPECIFIED:The message Class is not set in the outgoing or incoming message. (對(duì)發(fā)出或收到的短信不進(jìn)行設(shè)置)
分析以上五個(gè)值,前四個(gè)值有一個(gè)共同的特點(diǎn),都需要向SMSC發(fā)送確認(rèn)。而最后一個(gè)值沒有設(shè)定。
這個(gè)值的改動(dòng),解決了我所遇到的問題。但究其原因,我有些想不通為什么?
但是在實(shí)際應(yīng)用中,出現(xiàn)了tmail.exe的異常。不知道是這個(gè)值的變動(dòng)帶來的問題,還是實(shí)際模塊中存在的問題。還需要繼續(xù)研究一下。
如果大家有知道的,給些建議哈.
前階段在調(diào)研mobile上的內(nèi)存釋放問題,根據(jù)大家的建議嘗試了一些,但是沒有什么效果。
于是跑到MSDN上去問相關(guān)的問題,得到了一些解答。
As far as I know, I don't think there is other way to meet your requirement. Since each mobile application has 32M memory limitation, we have to do the performance manually, like deleting object which is not used and allocating Large Memory Blocks in Large memory Area.
For more information:
Windows CE .NET Advanced Memory Management
How the Windows Mobile 5.0 Shell Handles Low Memory Situations
我看了一部分,在How the Windows Mobile 5.0 Shell Handles Low Memory Situations中提到,

Hibernate
This is the amount of memory the shell tries to keep free at all times. If the amount of free memory falls below this value then the low memory check routine will try to free up memory. It will do this by first sending WM_HIBERNATE to all valid applications. When an application receives this message it should try to free as many resources as possible. When the low memory check routine runs again and the amount of free memory is still below the hibernate level then the shell will try to close the least recently used (LRU) application by sending a WM_CLOSE message. If the low memory check routine runs yet again and the amount of free memory is still below the hibernate level then the shell will call TerminateProcess on the LRU application that it last sent the WM_CLOSE message to.
我對(duì)這段話的理解是:當(dāng)空閑內(nèi)存小于Hibernate時(shí),系統(tǒng)便會(huì)嘗試釋放內(nèi)存。首先他會(huì)向所有有效的程序發(fā)送WM_HIBERNATE。應(yīng)用程序收到該消息后,會(huì)盡量釋放資源來釋放內(nèi)存。如果還低于這個(gè)值的話,將發(fā)送WM_CLOSE消息給最近很少使用的程序。如果還低于該值的,就強(qiáng)行關(guān)閉該程序了。
這個(gè)方法似乎有效,但是用戶再起來程序的話,還是一樣的效果,并不是達(dá)到了什么釋放內(nèi)存的效果。如何記錄最近很少使用的程序,這個(gè)是不是有什么方法獲得呢?
就可以像系統(tǒng)提示的那樣,內(nèi)存不足,請(qǐng)釋放一些內(nèi)存。手工做一些比較好。
也看了一些相近的程序的做法,似乎效果也沒有大家說的那么好。
在How the Windows Mobile 5.0 Shell Handles Low Memory Situations的最后,這樣寫的
What can my Application do?
The best thing your application can do when faced with a low memory situation is to play nicely with the rest of the device.
1、If your application receives a WM_HIBERNATE message free up any resources not absolutely required.
2、If you are planning on allocating a large amount of memory (or if a large allocation fails) you should call SHCloseApps, which will invoke the shell low memory check routine and will try to ensure that enough free memory exists. See below for an example:
#define MIN_MEMORY_TO_RUN 2*1024*1024

MEMORYSTATUS mst;

mst.dwLength = sizeof(MEMORYSTATUS);

GlobalMemoryStatus(&mst);

If (mst.dwAvailPhys < MIN_MEMORY_TO_RUN)



{

// Try to free memory by asking Shell to shutdown apps

if (!SHCloseApps(MIN_MEMORY_TO_RUN))


{

// Handle the case where memory could not be freed

…


專門查了一下
SHCloseApps的用法
原型:BOOL SHCloseApps( DWORD dwMemSought);
功能:This function tries to free up memory for an application. If necessary, the shell closes down other applications by sending
dwMemSought);
功能:This function tries to free up memory for an application. If necessary, the shell closes down other applications by sending
WM_CLOSE messages.
參數(shù):
dwMemSought Specifies, in bytes, the amount of memory to be freed.
通過了解
dwMemSought Specifies, in bytes, the amount of memory to be freed.
通過了解
SHCloseApps,我們就明白了上面那段代碼什么意思了。
看來,內(nèi)存釋放并不是真正意義上的內(nèi)存整理,看來我有的地方誤解了!