原创 內存映射文件使用範例

使用內存映射文件必須執行下列操作步驟 1.創建或打開一個文件內核對象,該對象用於標識你想用作內存映射文件的文件 2.創建一個文件映射內核對象,告訴系統該文件的大小和你打算該如何訪問該文件 3.讓系統將文件映射對象的一部分或全

原创 使用內存映射文件處理大文件示例

前面我們講過內存映射文件的使用,但是,如果文件大小超過內存大小那怎麼辦呢 其實,我們在把內存映射文件映射到進程的地址空間時,可以映射一部分,通過一個循環,把整個文件處理完 下面我舉個例子 #include <windows.h>

原创 c/c++運行期庫的使用

本次介紹關於c/c++運行庫的一些重要的內容 很多人在使用malloc,free函數時,會經常出現內存錯誤 比如下面的源碼 void ExeFunc() { PVOID pv=DLLFunc(); free(p

原创 printf sprintf %s %S

printf 的%s,用來打印ANSI字符串 printf的%S,用來打印UNICODE字符串 #include <Windows.h> #include <stdio.h> #include <tchar.h> #includ

原创 關於堆棧(1)

我們總結一下前面講過的: 虛擬內存: 1.虛擬內存可以用於處理大批量數據 內存映射文件: 1.內存映射文件加載exe和DLL可以節省時間和頁文件 2.使用內存映射文件來訪問磁盤上的文件,可以避免I/O讀寫,也不需要爲文件

原创 動態tls的使用

多線程的時候最好不要使用全局和靜態變量,因爲如果一個線程改變了全局變量的值,另一個線程在不知情的情況下有可能引用這個變量導致不可預料的錯誤 我們先舉個例子 假設兩個線程各自從0-9999計數 如果我們這樣寫 main.cp

原创 在應用程序中使用虛擬內存(VirtualAlloc VirtualFree)

此虛擬內存非彼虛擬內存,此虛擬內存實際上指的是虛擬地址空間 LPVOID VirtualAlloc{ LPVOID lpAddress, // 要分配的內存區域的地址 DWORD dwSize, // 分配的大小 DWOR

原创 關於堆棧(2)

創建輔助堆棧: HANDLE HeapCreate( DWORD flOptions, // heap allocation attributes SIZE_T dwInitialSize, // in

原创 c/c++堆棧檢查函數詳解

c/c++運行期庫包含一個堆棧檢查函數,當編譯源代碼的時候,編譯器在恰當的時候(這個在下面講)生成對該函數的調用 下面我們看個函數 void SomeFunction() { int nValues[4000];

原创 稀疏提交的內存映射文件

前面提到CreateFileMapping創建映射文件 第三個參數主要有三個值PAGE_READONLY,PAGE_READWRITE,PAGE_WRITECOPY 這三個值得意思我就不在做描述了 其實還有SEC_COMMIT

原创 內存映射文件原理探索

  一直都對內存映射文件這個概念很模糊,不知道它和虛擬內存有什麼區別,而且映射這個詞也很讓人迷茫,今天終於搞清楚了。。。下面,我先解釋一下我對映射這個詞的理解,再區分一下幾個容易混淆的概念,之後,什麼是內存映射就很明朗

原创 DLL延遲加載和即時卸載

今天我們來講講DLL的高級應用:DLL的延遲加載 若要延遲加載,必須要多加兩個鏈接程序開關 /Lib:DelayImp.lib /DelayLoad:MyDll.dll 第一個開關告訴鏈接程序將一個特殊的函數delayLo

原创 GlobalMemoryStatus詳解

VOID GlobalMemoryStatus( LPMEMORYSTATUS lpBuffer // 內存狀態的指針 ); 用法我就不講了,現在我們講講MEMORYSTATUS結構裏每個成員分別代表什麼 type

原创 c++編寫供其他工具使用的dll

以前我曾經說過dll的編寫,但是以前編寫的dll無法供其他工具使用 以前我們是這樣寫的 DllGenerator.h #ifndef _DLLGENERATOR_H #define _DLLGENERATOR_H #ifdef

原创 線程的堆棧結構詳解

每當創建一個線程的時候,系統會爲現成的堆棧保留一個堆棧空間區域,並將一些物理存儲器提交給這個區域,按照默認設置,系統保留1MB的地址空間,並提交兩個頁面,爲什麼初始是2個頁面,接下來會有說明 win2000及以上的系統版本 首