收集五個常見 VC++ 開發實用技巧,涵蓋視窗樣式控制、訊息傳送、Shell 擴充、檔案系統操作與建置知識。
// 隱藏
LONG style = GetWindowLong(m_hWnd, GWL_STYLE);
SetWindowLong(m_hWnd, GWL_STYLE, style & ~WS_CAPTION);
SetWindowPos(m_hWnd, NULL, 0,0,0,0,
SWP_NOSIZE|SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE|SWP_FRAMECHANGED);
// 顯示
SetWindowLong(m_hWnd, GWL_STYLE, style | WS_CAPTION);
SetWindowPos(m_hWnd, NULL, 0,0,0,0,
SWP_NOSIZE|SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE|SWP_FRAMECHANGED);
// 隱藏
ModifyStyle(WS_CAPTION, 0, SWP_FRAMECHANGED);
// 顯示
ModifyStyle(0, WS_CAPTION, SWP_FRAMECHANGED);
HWND hEdit = GetDlgItem(IDC_EDIT1)->GetSafeHwnd();
SendMessage(hEdit, WM_SETTEXT, 0, (LPARAM)_T(""));
SHELLEXECUTEINFO sei = {0};
sei.cbSize = sizeof(sei);
sei.fMask = SEE_MASK_INVOKEIDLIST;
sei.lpVerb = _T("properties");
sei.lpFile = _T("C:\\Test.txt"); // 或資料夾路徑
sei.nShow = SW_SHOW;
ShellExecuteEx(&sei);
BOOL DeleteDirectory(LPCTSTR path)
{
CFileFind ff; CString search = path; search.TrimRight(_T('\\')); search += _T("\\*.*");
BOOL found = ff.FindFile(search);
while (found) {
found = ff.FindNextFile();
if (ff.IsDots()) continue;
CString full = ff.GetFilePath();
if (ff.IsDirectory()) DeleteDirectory(full);
else DeleteFile(full);
}
ff.Close();
return RemoveDirectory(path);
}
int DeleteDirectoryWin32(LPCWSTR path)
{
if (!path || wcslen(path) > MAX_PATH - 5) return 0;
WCHAR root[MAX_PATH], search[MAX_PATH];
wcscpy(root, path);
int len = wcslen(root);
if (root[len-1] != L'\\') { root[len] = L'\\'; root[len+1] = 0; }
wcscpy(search, root); wcscat(search, L"*.*");
WIN32_FIND_DATA fd; HANDLE h = FindFirstFile(search, &fd);
if (h == INVALID_HANDLE_VALUE) return 0;
do {
if (wcscmp(fd.cFileName, L".")==0 || wcscmp(fd.cFileName, L"..")==0) continue;
WCHAR full[MAX_PATH]; wcscpy(full, root); wcscat(full, fd.cFileName);
if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
DeleteDirectoryWin32(full); _wrmdir(full);
} else DeleteFile(full);
} while (FindNextFile(h, &fd));
FindClose(h);
return 1;
}
| 特性 | .lib (靜態/匯入庫) | .dll (動態連結庫) |
|---|---|---|
| 連結時機 | 編譯/連結階段 | 執行階段載入 |
| 檔案性質 | 目標檔封存 (靜態) 或匯入符號表 (動態) | 獨立可執行映像 (PE) |
| 部署 | 靜態:無額外檔;動態:需隨程式部署 .dll | 必須部署 .dll |
| 更新 | 靜態:重新編譯;動態:替換 .dll 即可 | 替換 .dll 即可 (版本相容) |
| 符號解析 | 連結器 | 載入器 |
LoadLibrary/GetProcAddress 手動載入。extern "C" { #include "clib.h" } 防止名稱修飾衝突。