void CChildView::OnTaskListdriver()
{
CClientDC dc(this);
TCHAR szBuffer[MAX_PATH];
HANDLE hFind=::FindFirstVolume(szBuffer,MAX_PATH);
if(hFind!=INVALID_HANDLE_VALUE)
{
int i=0;
do
{
dc.TextOut(0,i*20,szBuffer,MAX_PATH);
}while(::FindNextVolume(hFind,szBuffer,MAX_PATH));
::FindVolumeClose(hFind);
}
}这个函数编译时系统提示
ChildView.cpp
d:\Project\C++\solution\Test\ChildView.cpp(84) : error C2039: “FindFirstVolume” : 不是“operator``global namespace''”的成员
d:\Project\C++\solution\Test\ChildView.cpp(84) : error C2065: “FindFirstVolume” : 未声明的标识符
d:\Project\C++\solution\Test\ChildView.cpp(91) : error C2039: “FindNextVolume” : 不是“operator``global namespace''”的成员
d:\Project\C++\solution\Test\ChildView.cpp(91) : error C2065: “FindNextVolume” : 未声明的标识符
d:\Project\C++\solution\Test\ChildView.cpp(92) : error C2039: “FindVolumeClose” : 不是“operator``global namespace''”的成员
d:\Project\C++\solution\Test\ChildView.cpp(92) : error C2065: “FindVolumeClose” : 未声明的标识符生成日志保存在“file://d:\Project\C++\solution\Test\Debug\BuildLog.htm”中
Test - 6 错误,0 警告
但是下面这个同样调用API 也是FILE I/O的API函数 就可以通过void CChildView::OnListDirectory()
{
CClientDC dc(this);
::WIN32_FIND_DATA fd;
HANDLE hFind=::FindFirstFile(_T("C:\\*.*"),&fd);
if(hFind!=INVALID_HANDLE_VALUE)
{
int i=0;
do
{
if(fd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
{
dc.TextOut(0,i*20,fd.cFileName);
i++;
}

}while(::FindNextFile(hFind,&fd));
::FindClose(hFind);
}

}p.s. 第二函数中WIN32_FIND_DATA一定要用::WIN32_FIND_DATA才可以而HANDLE却可以直接使用 
WIN32_FIND_DATA定义在(WINBASE.H) HANDLE 定义在(WINNT.H)是不是有关系?盼复

解决方案 »

  1.   

    Kernel32.lib
    应该是头文件或库文件的问题
    是一是在工程里面加入
    #pragma comment(lib,"Kernel32.lib")
    头文件在Windows.h
      

  2.   

    #define _WIN32_WINNT 0x0500
    #include <windows.h>
      

  3.   

    绝对不是中文 我用::的时候 IDE的智能感知还把所有的API什么列出来让我选,而且里面确实有FindFirstVolume的函数。
    而且 我在跟踪defination的时候在 winbase.h里找到了
    WINBASEAPI
    BOOL
    WINAPI
    FindVolumeClose(
        HANDLE hFindVolume
        );WINBASEAPI
    BOOL
    WINAPI
    FindNextVolumeA(
        HANDLE hFindVolume,
        LPSTR lpszVolumeName,
        DWORD cchBufferLength
        );
    WINBASEAPI
    BOOL
    WINAPI
    FindNextVolumeW(
        HANDLE hFindVolume,
        LPWSTR lpszVolumeName,
        DWORD cchBufferLength
        );
    #ifdef UNICODE
    #define FindNextVolume FindNextVolumeW
    #else
    #define FindNextVolume FindNextVolumeA
    #endif // !UNICODE这几个不能编译通过的函数他们和能够通过的那几个函数在同一个文件中。 
    现在百思不得其解。
    那位老大帮帮我。
      

  4.   

    你一定要在头文件里加上这一句#define _WIN32_WINNT 0x0500
      

  5.   

    to  hahu(dragon) :
    如果是头文件和库文件为什么在一起的API有的成功有的不行?
    而且是同样类型的API ,在同一个header 里面
    #include <windows.h>我已经加过 
    虽说MFC程序的 <afxwin.h>已经包含了我还是加了 不行!!to  lsgfgs(李氏)
    你说的已经定义过了
    谢谢。p.s 我用的是
    win2k professional sp3
    Microsoft Visual C++ .NET   55601-652-0000007-18053
      

  6.   

    已经解决了
    关键在于
    #define _WIN32_WINNT 0x0500
    我已经在
    stdafx.h里找到相应的
    原来是
    #ifndef _WIN32_WINNT
    #define #define _WIN32_WINNT 0x0400
    #endif 已经编译通过
    但是那位老大告诉我为什么〉?
      

  7.   

    因为NT5。0才支持这个API,4。0不支持
      

  8.   

    Jim3277(春雪明月关,寂寞远古城) 大哥满意吗?
    不满意我再加一点 :-)