LPWSTR *szArglist = NULL;  

int nArgs = 0;   

szArglist = CommandLineToArgvW(GetCommandLineW(), &nArgs); 

CString Work_num; CString pwd; Work_num.Format("%s",szArglist[1]); pwd.Format("%s",szArglist[2]); if( NULL != szArglist)   
{   
try{

CRecordset rs(&m_db);

CString sql ;

sql.Format("select * from users where work_num = '%s' and pwd = '%s'",Work_num,pwd); rs.Open(CRecordset::dynaset,sql);

if(rs.IsEOF()==0){ GetDlgItem(IDC_LOGINNAME)->SetWindowText(my_name) ;

}
else
{ MessageBox("管理员名或密码错误","提示"); OnCancel();

}

}catch(CDBException *pe)
{

pe->ReportError();

}   
}  LocalFree(szArglist);
//我传的命令行参数是:E:\PAMS_COMEXE\PAMS_COM.exe 0201 32222 长度是3,这个可以看出来,但我取的值szArglist[0] //szArglist[1] szArglist[2] 分别是:E、0、3 请问我如何才能取到完整的字符串?

解决方案 »

  1.   

    LPWSTR ?
    你用的是宽字符的吧!而你程序中用的可能是ascii码
      

  2.   

    WideCharToMultiByte 用这个先转化一下,然后再传给cstring
      

  3.   

    http://blog.csdn.net/norains/archive/2006/12/25/1461174.aspx
      

  4.   

    CString Work_num;    CString pwd;
    把你的这些换成WCHAR [];使用swprintf函数来格式化数据
      

  5.   

    CString Work_num;    CString pwd;    Work_num.Format("%s",szArglist[1]);    pwd.Format("%s",szArglist[2]);
    --》
    WCHAR Work_num[MAX_APTH] = {0};
    WCHAR pwd[20] = {0};swprintf(pwd, L"%s", szArglist[1]);
    swprintf(Work_num, L"%s",szArglist[2]);
      

  6.   

    DWORD dwNum = WideCharToMultiByte(CP_OEMCP,NULL,szArglist[1],-1,NULL,0,NULL,FALSE);
    char *psDest;
    psDest= new char[dwNum];
    if(!psDest)
    {
       delete []psDest;
    }
    WideCharToMultiByte (CP_OEMCP,NULL,szArglist[1],-1,psDest,dwNum,NULL,FALSE);Work_num.Format("%s",psDest );delete []psDest;其他同理
      

  7.   

    简单办法,把你的工程改为支持UNICODE的程序,这样改动最小。
      

  8.   

    工程使用的是ansi 字符集,因为牵涉到和移动设备的数据交换,有限制,只能用ansi.
      

  9.   

    哦,这样,如果你的数据库用的是ANSI存储的,那么,就将szArglist先用WideCharToMultiByte转为ANSI,如果你的数据库是UNICODE存储的,那么直接用CStringW就可以了
      

  10.   

    这样的查询语句有严重的安全隐患!在用户、密码处依次输入:
    ee' or '1'='1
    ee' or '1'='1
    一个典型的注入漏洞!改改查询方法吧!