请问一个关于 argv的有关问题

请教一个关于 argv的问题
本帖最后由 k623277335 于 2015-05-17 13:40:55 编辑
MAIN函数

int main(int argc, char* argv[])
{

TCHAR    wszPath[MAX_PATH];
TCHAR    wszPath3[MAX_PATH];
HRESULT hResult = S_OK;
if(argc > 1){
printf( "Connecting to filter's port...\n" );
hResult = FilterConnectCommunicationPort( MINISPY_PORT_NAME,
0,
NULL,
0,
NULL,
&port );

   mbstowcs(wszPath,  argv[2], lstrlen(wszPath) + 1);
mbstowcs(wszPath3, argv[3], lstrlen(wszPath) + 1);

MyAddProtectPath(wszPath, wszPath3);

MyAddProtectPath(L"C:\\xx", L"*.html");


}

if (IS_ERROR( hResult )) 
{

printf( "Could not connect to filter: 0x%08x\n", hResult );
goto Main_Exit;
}

getchar();


Main_Exit:

if (INVALID_HANDLE_VALUE != port) 
{
CloseHandle( port );
}
return 0;

}

VOID MyAddProtectPath(WCHAR  *path, WCHAR *fileType)
{
DWORD result;
INPUT_BUFFER input;

ZeroMemory(&input, sizeof(INPUT_BUFFER));

input.command = ADD_PROTECTED_PATH;
wcscpy(input.protectedPath, path);
wcscpy(input.fileType, fileType);


//发送 ADD_PROTECTED_PATH命令,准备和驱动层进行通信
FilterSendMessage(port,
&input,
sizeof(INPUT_BUFFER),
NULL,
0,
&result);
}


调用MyAddProtectPath
直接在代码里面写
MyAddProtectPath(L"C:\\xx", L"*.html");
 
能够成功执行函数

如果这样写
MyAddProtectPath(wszPath, wszPath3);


然后在命令行运行 
C:\Documents and Settings\Administrator\Debug>HideExtendFileNameApply.exe "C:\\xxx" "*.html"

无法成功调用函数,请大家帮我看看这个问题




------解决思路----------------------

mbstowcs(wszPath,  argv[2], lstrlen(wszPath) + 1);
mbstowcs(wszPath3, argv[3], lstrlen(wszPath) + 1);

在以上两句后下断点,查看是否转换成功
------解决思路----------------------
引用:
lstrlen(wszPath) + 1

换成
sizeof wszPath

应该是
sizeof wszPath/sizeof *wszPath

------解决思路----------------------
大家都看到了, 就是那个lstrlen遭了,   
这个是求字符串长度, 不是缓冲区长度. 

sizeof可以求数组形的缓冲区长度.

在你的程序中既然用到的常量, 那么使用MAX_PATH作为参数是最好的.

lstrlen(wszPath) + 1  //这里的+1也有问题.  缓冲区只有MAX_PATH, 你却还想+1, 极端情况下, 就溢出了.  只能是-1, 为\0留出一个空间. 
------解决思路----------------------
strlen和sizeof弄混了。