【问题标题】:Something wrong with this Loop?这个循环有问题吗?
【发布时间】:2015-11-28 02:17:09
【问题描述】:

嵌入循环的代码构建并运行良好。尝试在 LinkEmbedManifest 步骤中构建它(MBCS 中的 VS10)失败,并出现 link 1168 错误。

    WIN32_FIND_DATA da;   // directory data
    TCHAR *Path;    // directory Pointer
    HANDLE ds;     // directory handle  
    int Listindex=0;
    Path = "C:\\";
    SetCurrentDirectory(Path);     
    Listindex=0
    ds = FindFirstFile(TEXT("*"),&da);
        do       {
            int index = SendDlgItemMessage(hwnd, IDC_LIST, LB_ADDSTRING, (WPARAM)Listindex, (LPARAM)&da);

            SendDlgItemMessage(hwnd, IDC_LIST, LB_SETITEMDATA, (WPARAM)index, (LPARAM)Listindex);
            Listindex+=1;
            } 
            while( FindNextFile(ds,&da) != ERROR_NO_MORE_ITEMS);


    FindClose(ds);

目的是列出 C 根目录中的目录。从 LONG_PTR LRESULT 隐式转换为带有索引的 int,并进一步使用 LPARAM 和 WPARAM 进行转换。如果将它们替换为模块范围的 decs 会有什么不同吗? 或者完全改变循环的类型会更好吗?

【问题讨论】:

  • da 是一个WIN32_FIND_DATA 结构(我假设),您为什么尝试将指向它的指针作为字符串添加到libsbox?传递da.cFileName 不是更有意义吗?此外,每次尝试添加结构时,您都在传递相同的指针,因此所有条目无论如何都是相同的。
  • 哎呀,谢谢- [face-palm] 把它们放进去。我想像 Listindex 这样的东西会更合适。也许是 FOR 循环?
  • @Joachim-Pileborg,Windows 将字符串从 SendMessage 复制到内部字符串,因此列表框中的条目将不同。
  • 它现在构建得很好,但是 pacman exe 是一个狂热的内存处理器。列表框永远不会显示。这里必须有所改变。

标签: c list api directory


【解决方案1】:

FWIW 这个问题有这么多错误,难怪它被标记了。最大的问题是在整个 da 记录上测试 ERROR_NO_MORE_ITEMS 而不是 da.cFileName,因此是无限循环:。

#include <windows.h>
#include <winnt.h>
#include "resource.h" //Listbox data

WIN32_FIND_DATA da;   // directory data this will use stack memory as opposed to LPWIN32_FIND_DATA
TCHAR *driveIDptr;  
char driveID;
HANDLE ds;     // directory handle

BOOL CALLBACK DlgProc(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
switch(Msg)
{
        case WM_INITDIALOG:

{       
    int listindex = 0;

    //Populate List
    driveIDptr = "C:\\*";
    memset(&da, 0, sizeof(WIN32_FIND_DATA));

    ds = FindFirstFile(driveIDptr, &da);
    driveIDptr = "C:\\"; //Shocking, but costs less than a strcat in above find function

    if (ds == INVALID_HANDLE_VALUE)
    {
     StringCchPrintf (pszDest, cbDest, TEXT("No directories found."));
    return FALSE;
    }

    while (ds != INVALID_HANDLE_VALUE && ds)
    {

        if (FindNextFile(ds, &da) == FALSE) break;

    if((da.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && !(da.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM
|| da.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT || da.dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE || da.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN )) {

    strcpy (&driveID, (char *) driveIDptr);
    strcat (&driveID,  da.cFileName);
    SendDlgItemMessage(hwnd, IDC_LIST, LB_ADDSTRING, (WPARAM)listindex, (LPARAM)&driveID);

        SendDlgItemMessage(hwnd, IDC_LIST, LB_SETITEMDATA, (WPARAM)listindex, (LPARAM)listindex);
        listindex+=1;
    }

    } 
        FindClose(ds);

        //other Msg cases...

【讨论】:

    猜你喜欢
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    相关资源
    最近更新 更多