getvolumenameforvolumemountpoint VC6提示该函数未定义

在VC6下使用getvolumenameforvolumemountpoint得到卷标,系统提示,该函数未定义,于VC7下找到该函数的.H并包含进去,系统提示LNK错误?查了.lib文件有该函数。为什么?该如何解决?
---------回复--------------
是不是你的.Lib不够新,   里面没有那个函数,  
.H文件包含VC7的INCLUDE下,   那.LIB的路径呢?   是否也是VC7下的LIB路径?
---------回复--------------
是新的,已将原.lib用新的覆盖。同时在.net下进行了测试,有同样的问题存在。


---------回复--------------
源码如下:
#define       _WIN32_WINNT       0x0500//注意这里      
       
    #include       <windows.h>      
    #include       <stdio.h>      
       
    #define       BUFSIZE       1024                   //       ample       space       for       our       string       buffer      
       
    void      
    Syntax       (char       *argv)      
    {      
                printf(       "%s,       mount       a       volume       at       a       mount       point./n ",       argv       );      
                printf(       "For       example,       / "mount       c://mnt//fdrive//       f:/// "/n "       );      
    }      
       
    int      
    main(       int       argc,       char       *argv[]       )      
    {      
                BOOL       bFlag;      
                char       Buf[BUFSIZE];                                                   //       temporary       buffer       for       volume       name      
       
                if(       argc       !=       3       )          
                {      
                            Syntax(       argv[0]       );      
                            return(       -1       );      
                }      
       
            //       We       should       do       some       error       checking       on       the       inputs.       Make       sure      
            //       there       are       colons       and       backslashes       in       the       right       places,       etc.          
       
                bFlag       =       GetVolumeNameForVolumeMountPoint(      
                                                            argv[2],       //       input       volume       mount       point       or       directory      
                                                                            Buf,       //       output       volume       name       buffer      
                                                                BUFSIZE       //       size       of       volume       name       buffer      
                                                );      
       
                if       (bFlag       !=       TRUE)          
                {      
                            printf(       "Retrieving       volume       name       for       %s       failed./n ",       argv[2]       );      
                            return       (-2);      
                }      
                printf(       "Volume       name       of       %s       is       %s/n ",       argv[2],       Buf       );      
       
                bFlag       =       SetVolumeMountPoint(      
                                                            argv[1],       //       mount       point      
                                                                                Buf       //       volume       to       be       mounted      
                                                );      
       
                if       (!bFlag)          
                        printf       ( "Attempt       to       mount       %s       at       %s       failed./n ",       argv[2],       argv[1]);      
       
                return       (bFlag);      
    }      

---------回复--------------
那在程序中用GetProcAddress(..)看能否直接从DLL得到函数入口.
如果能,   还是LIB的问题

---------回复--------------
好比,试试去!
另外,会是补丁不够新的原因吗?
---------回复--------------
GetProcAddress(..)还是不行,怎么办?求助......
---------回复--------------
知道原因了,   用下面的函数名试一下:

GetVolumeNameForVolumeMountPointW()   //加个W   ->   UNICODE
GetVolumeNameForVolumeMountPointA()   //加个A   ->   ANSI  

不要用   GetVolumeNameForVolumeMountPoint()
---------回复--------------
测试程序

#include   "crtdbg.h "
#include   "windows "

int   main(void)
{
        HMODULE   hMod   =   LoadLibrary(   TEXT( "kernel32.dll ")   );
        if(   hMod   )
        {
                FARPROC   lpfn   =   GetProcAddress(hMod,   "GetVolumeNameForVolumeMountPointW ");
                _ASSERTE(   lpfn   !=   NULL   );
                FreeLibrary(   hMod   );
        }
}
---------回复--------------
ok!万分感谢!
另外还想问一下,曾经看到一个帖子说通过SetupDiGetInterfaceDeviceDetail()可以得到DevicePath,并通过GetVolumeNameForVolumeMountPoint()可以得到volume   name。我通过移动硬盘进行测试,在执行GetVolumeNameForVolumeMountPoint()时返回错误代码1,不知为何?查了半天也没有结论。能帮我决绝吗?谢谢
---------回复--------------
对不起,是解决,不是决绝。。。。。

---------回复--------------
源码如下:
CHAR   GetSpecificDrive(LPTSTR   lpDevID)      
{      
HDEVINFO   hDevInfo;      
//GUID   guid;      
BYTE   buffer[BUFFER_SIZE];      
DWORD   dwRequiredSize       ;      
CHAR   buf[BUFFER_SIZE];      
DEVINST   devInstParent;      
DWORD   dwIndex;      
CHAR   volume[BUFFER_SIZE];      
int   nLength,nLoopIndex;      
                   
SP_DEVICE_INTERFACE_DATA   devInterfaceData;      
SP_DEVINFO_DATA   devInfoData;      
PSP_DEVICE_INTERFACE_DETAIL_DATA   pDevDetail;      

if(!lpDevID)      
{      
return   0;      
}      
                   
//       GUID_DEVINTERFACE_VOLUME       is       interface       Guid       for       Volume       class       devices.      
GUID   guid   =     {   0xA5DCBF10L,0x6530,0x11D2,0x90,0x1F,0x00,0xC0,0x4F,0xB9,0x51,0xED};          
       
//   取得一个该GUID相关的设备信息集句柄
hDevInfo   =   ::SetupDiGetClassDevs((LPGUID)&guid,//GUID_CLASS_USB_DEVICE,   //   class   GUID  
NULL,   //   无关键字  
NULL,   //   不指定父窗口句柄  
DIGCF_PRESENT   |   DIGCF_DEVICEINTERFACE);   //   目前存在的设备

//   失败...
if   (hDevInfo   ==   INVALID_HANDLE_VALUE)
{
return   0;
}    
       
//       Loop       until       device       interfaces       are       found.
//   设备序号=0,1,2...   逐一测试设备接口,到失败为止
for(dwIndex   =   0;       ;dwIndex++)      
{                                  
ZeroMemory(&devInterfaceData,sizeof(devInterfaceData));      
devInterfaceData.cbSize   =   sizeof(devInterfaceData);      
       
//       Get       device       Interface       data.
//   枚举符合该GUID的设备接口
if(!SetupDiEnumDeviceInterfaces(hDevInfo,//   设备信息集句柄
NULL,   //   不需额外的设备描述
&guid,   //   GUID  
dwIndex,//   设备信息集里的设备序号
&devInterfaceData))   //   设备接口信息  
{      
break;      
}      

ZeroMemory(&devInfoData,sizeof(devInfoData));      
devInfoData.cbSize   =   sizeof(devInfoData);      

pDevDetail   =   (PSP_DEVICE_INTERFACE_DETAIL_DATA)buffer;      
pDevDetail-> cbSize   =   sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);      

//       Get       device       interface       detail       data       to       get      
//               Device       Instance       from       SP_DEVINFO_DATA       and      
//           Device       Path       from       SP_DEVICE_INTERFACE_DETAIL_DATA    
SetupDiGetDeviceInterfaceDetail(hDevInfo,      
    &devInterfaceData,   //   设备信息集句柄  
    pDevDetail,   //   设备接口信息  
    BUFFER_SIZE,      
    &dwRequiredSize,      
    &devInfoData);   //       SP_DEVINFO_DATA    

 
CString   tempPath;
//       Append       /       to       the       DevicePath       of       SP_DEVICE_INTERFACE_DETAIL_DATA    
nLength   =   strlen(pDevDetail-> DevicePath);      
pDevDetail-> DevicePath[nLength]   =   '// ';      
pDevDetail-> DevicePath[nLength+1]   =   '/0 ';      
tempPath=pDevDetail-> DevicePath;
BOOL   re=GetVolumeNameForVolumeMountPointA(tempPath,       volume,   BUFFER_SIZE);
if(re)
{      
for(nLoopIndex=0;   nLoopIndex   <   g_count;   nLoopIndex++)      
{      
//       Compare       volume       mount       point       with       the       one       stored       earlier.      
//       If       both       match,       return       the       corresponding       drive       letter.  
if(strcmp(g_drives[nLoopIndex].volume,   volume)==0)      
{      
SetupDiDestroyDeviceInfoList(hDevInfo);      
return       g_drives[nLoopIndex].letter;      
}      
}      
}    
else
{
CHAR   szBuf[80];  
DWORD   dw   =   GetLastError();
MessageBox(NULL,   szBuf,   "Error ",   MB_OK);  

}
}      
}      

SetupDiDestroyDeviceInfoList(hDevInfo);      
TRACE( "Error       -       No       drives       found       in       GetSpecificDrives/n ");                                                                              
return       0;      
}
---------回复--------------
奇怪的是,   我在程序中直接
GetVolumeNameForVolumeMountPoint(...)是没有问题的,   不知道的是怎么回事情.
================================================================================

另外还想问一下,曾经看到一个帖子说通过SetupDiGetInterfaceDeviceDetail()可以得到DevicePath,并通过GetVolumeNameForVolumeMountPoint()可以得到volume   name。我通过移动硬盘进行测试,在执行GetVolumeNameForVolumeMountPoint()时返回错误代码1,不知为何?查了半天也没有结论。能帮我决绝吗?谢谢
------------------------------------------ --------------------------------------
返回错误代码1,   好象是FILE_NOT_FOUND,   还是DENIED   ACCESS(这你再查查),   你把代码帖出来,我回头看看
---------回复--------------
返回错误代码1,   是ERROR_INVALID_FUNCTION.
GetVolumeNameForVolumeMountPoint(...)直接写入盘符是没问题的如 "C:// ",我试过。但
DevicePath确不行。
代码在上面已经贴出来了。
辛苦了!谢谢
---------回复--------------
tempPath=pDevDetail-> DevicePath;
BOOL   re=GetVolumeNameForVolumeMountPointA(tempPath,       volume,   BUFFER_SIZE);

这里tempPath返回的是什么样子的字符串,   比如E:/,   还是什么别的形式呢?

---------回复--------------
我试移动硬盘返回的是:
//?/usb#vid_067b&pid_2507#0#{a5dcbf10_6530_11d2_901f_00c04fb951ed}
---------回复--------------
//?/usb#vid_067b&pid_2507#0#{a5dcbf10_6530_11d2_901f_00c04fb951ed}
我用这个在注册表里找了找,   能找到(当然是我自己的U盘的vid和pid),   但没有想出映射到C:/   D:/这些的方法.

现在换了一个办法,   SetupDiGetClassDevs()不是提供的一个Interface   class的GUID,   而是提供devguid.h中的GUID_DEVCLASS_VOLUME,   既磁盘的卷.   然后再操作一些[HKLM/SYSTEM/MountedDevice]下注册表项,   现在在我的机器上可以找到USB棒和硬盘的对应盘符,   但不知道在别的机器上行不行.

不知LZ是否已经自己解决了,   如果需要程序,   请告诉我一个邮箱,   我发给你.
---------回复--------------
目前还没有找到好的方法解决,请把程序发给我吧!谢谢   :)
我的邮箱是:zhangliw1023@sina.com
---------回复--------------
已发,  
邮件标题:   FROM:   CRUMPY   VLS-ENUM
---------回复--------------
可以把整个工程压一下发给我吗?
谢谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值