在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
---------回复--------------
可以把整个工程压一下发给我吗?
谢谢