平臺:Windows
語言:C
IDE:Visual Studio 2019 Community
我正在做一個讀寫Windows組態檔(*.ini)的小程式。組態檔所在目錄都是純數字,非純數字的目錄下沒有組態檔。程式中使用FindFirstFile和FindNextFile來列舉給定目錄,然后獲取給定目錄下只含有數字字符的子目錄名稱,放到一個下拉串列框(組合框,ComboBox)里面。
以下是相關代碼:
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
static HWND hComboBox;
switch (message)
{
case WM_CREATE:
hComboBox = CreateWindow(WC_COMBOBOX,
TEXT(""),
CBS_DROPDOWN | WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_SORT,
90, 23, 130, 400,
hwnd, NULL, NULL, NULL);
static TCHAR Folder[MAX_PATH];
WIN32_FIND_DATA ffd;
HANDLE hFind = INVALID_HANDLE_VALUE;
DWORD dwError = 0;
HRESULT hr = SHGetFolderPathW(0, CSIDL_MYDOCUMENTS, 0, 0, Folder);
if (SUCCEEDED(hr))
{
StringCchCat(Folder, MAX_PATH, TEXT("\\work"));
if (DirectoryExists(Folder))
{
StringCchCat(Folder, MAX_PATH, TEXT("\\*"));
hFind = FindFirstFile(Folder, &ffd);
}
else
{
MessageBox(hwnd, TEXT("directory does not exist."), TEXT("error"), MB_ICONERROR);
}
if (INVALID_HANDLE_VALUE == hFind)
{
return 0;
}
do
{
if (ffd.cFileName[0] == '.') continue; // 跳過當前目錄“.”、上一級目錄“..”和隱藏目錄
if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) // 只要目錄,不要檔案
{
BOOL onlyDigit = TRUE;
for (int i = 0; i < sizeof(ffd.cFileName); i++)
{
if (ffd.cFileName[i] < '0' || ffd.cFileName[i] > '9')
{
onlyDigit = FALSE;
}
}
if (onlyDigit)
{
// 將只有數字的目錄名稱放到下拉串列框里面
SendMessage(hComboBox, (UINT)CB_ADDSTRING, (WPARAM)0, (LPARAM)ffd.cFileName);
}
}
}
while (FindNextFile(hFind, &ffd) != 0);
FindClose(hFind);
}
else
{
MessageBox(hwnd, TEXT("Failed to get special folder."), TEXT("ERROR"), MB_ICONERROR);
}
[其它代碼片段]
在上述do...while回圈里面,先是用
if (ffd.cFileName[0] == '.') continue;來過濾掉當前目錄“.”、上一級目錄“.”和隱藏目錄,然后用
if (ffd.cFileName[i] < '0' || ffd.cFileName[i] > '9')遍歷目錄名稱中的每個字符,如果含有非數字字符,就跳過該目錄名稱,處理下一個目錄名稱。
然而程式運行后,ComboBox里面啥也沒有,是空的。

不知道是上面的代碼哪里出了問題,或者有更好的方法來判斷目錄名稱是否純數字,還請大佬們指點一二。
之前是用C#和WinForm來做這個小程式的,現在改成C和Win32 GDI,突然感覺C#里面對Windows目錄、檔案、字串的處理更輕松許多,但是Windows 10下的WinForm沒法兼容Windows 7(需要安裝對應的.NetFramework),而且C#里面也要呼叫GetPrivateProfileString這個Win API函式來讀寫ini檔案,所以才改用C來寫win32。
現在碰到字串處理的問題,一時半會兒壓根不懂該怎么弄。如果是純C語言內的字串處理字串還好(像上面的代碼應該就能正常運行了),可現在是在Windows環境下,救救孩子吧...
uj5u.com熱心網友回復:
程式設計類的問題,不應發到相應語言的開發版塊么?我覺得,先在 Ln59 SendMessage() 上下斷點,看看是否被觸發,以確定問題到底在查找判斷方面,還是串列控制元件方面;然后再次劃分最終確定問題所在了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/276805.html
標籤:Windows客戶端使用
上一篇:AD域 多次下發洗掉 列印機后,用戶端出現多個重復的列印機,怎么清理
下一篇:激光slam建圖與定位精度評估
