VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1039|回复: 7

天啊,我的程序究竟有多大的漏洞,单单换了位置就改变了数值。我需要走多远才能可以写

[复制链接]

2

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-1-7 17:40:01 | 显示全部楼层 |阅读模式
void CDlgReportPreview::GetPrinterPara(TCHAR *szDevice,TCHAR szDriver,TCHAR *szOutput)
{
        HKEY hOpenKey1,hOpenKey2;
        long lResult = 0;
        DWORD dwKeyValueType = 0;
        DWORD dwKeyValueLength = 0;
       
        LPCTSTR keyName2 = L"Printers\\Ports";
//换了下面用到keyName2位置它的值不是Printers\Ports
        CString str;
        str.Format(_T("Driver"));
        LPCWSTR lpSubKey = TEXT("Printers");

        LPCTSTR dwKeyName2 = TEXT("Port5");

        CString keyName1(L"Printers\\");
//        LPTSTR keyName1 = L"Printers\\";如果是这样,第二次传入它的会添加了szDevice的值;
        TCHAR strKeyValue[500];
       
        CComboBox* pCmbReg = (CComboBox*)GetDlgItem(IDC_COMBO_PRINTER);       
        UpdateData(TRUE);
        CString strText;
        LPCTSTR lpctText;
        pCmbReg->GetWindowText(strText);
        lpctText = (LPCTSTR)strText;
        wsprintf(szDevice,lpctText);
       
        keyName1 += lpctText;
//        wcscat(keyName1,lpctText);
        lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,keyName1,0,0,&hOpenKey1);
        ASSERT(lResult == ERROR_SUCCESS);

        //read szDevice, szDriver and szOutput value       
        ZeroMemory(strKeyValue,sizeof(TCHAR)*50);
        dwKeyValueLength = sizeof(TCHAR)*50;

        lResult = RegQueryValueEx(hOpenKey1,str,0,&dwKeyValueType,
                (BYTE*)strKeyValue,&dwKeyValueLength);
        ASSERT(lResult == ERROR_SUCCESS);

        wsprintf(szDriver,strKeyValue);
        RegCloseKey(hOpenKey1);

//LPCTSTR keyName2 = L"Printers\\Ports"; 它返回的值不是我想要的。
        lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,keyName2,0,0,&hOpenKey2);
        ASSERT(lResult == ERROR_SUCCESS);


        ZeroMemory(strKeyValue,sizeof(TCHAR)*500);
        lResult = RegQueryValueEx(hOpenKey2,dwKeyName2,0,&dwKeyValueType,
                (BYTE*)strKeyValue,&dwKeyValueLength);
        ASSERT(lResult == ERROR_SUCCESS);

        wsprintf(szOutput,strKeyValue);
        RegCloseKey(hOpenKey2);
}
回复

使用道具 举报

0

主题

4

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-1-7 23:27:01 | 显示全部楼层
没看明白楼主的意思
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-8-30 17:15:01 | 显示全部楼层
没有看明白哟
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-8-30 17:30:01 | 显示全部楼层
CString   keyName1(L "Printers\\ ");
// LPTSTR   keyName1   =   L "Printers\\ ";如果是这样,第二次传入它的会添加了szDevice的值;
这个还是因为ASCII和UNICODE之间的转换出了问题。
好像CString还是不支持UNICODE,你写的那个keyName1(L "Printers\\ ");应该无效。
回复

使用道具 举报

0

主题

5

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-8-30 17:45:01 | 显示全部楼层
字符问题?
回复

使用道具 举报

0

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-8-30 18:00:01 | 显示全部楼层
如果出现变量被意外修改,多半问题是内存溢出,比如你的wsprintf是否会导致溢出。另外看你字符串的使用非常混乱,显然还没有理解各种类型的意义。
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-8-30 18:15:01 | 显示全部楼层
内存使用可能有问题
回复

使用道具 举报

0

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-8-30 18:30:01 | 显示全部楼层
Up.....
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表