在MFC+中获得桌面分辨率+; 我继承了一些用MFC C++编写的部分开发的10年的代码。我的任务是更新和完成应用程序

在MFC+中获得桌面分辨率+; 我继承了一些用MFC C++编写的部分开发的10年的代码。我的任务是更新和完成应用程序,c++,mfc,stringstream,getsystemmetrics,C++,Mfc,Stringstream,Getsystemmetrics,在CDialogChild类中,它在.h文件中如下所示: private: static const int m_iDefaultDesktopSizeX = 1024; static const int m_iDefaultDesktopSizeY = 740; 我仍在试图找出代码及其背后的逻辑,但我决定动态地获得解决方案。我从.h中删除了“static”关键字以及幻数,然后尝试在构造函数的初始化列表中定义它们: CDialogChild::CDialogChild(CWnd* pPare

在CDialogChild类中,它在.h文件中如下所示:

private:
static const int m_iDefaultDesktopSizeX = 1024;

static const int m_iDefaultDesktopSizeY = 740;
我仍在试图找出代码及其背后的逻辑,但我决定动态地获得解决方案。我从.h中删除了“static”关键字以及幻数,然后尝试在构造函数的初始化列表中定义它们:

CDialogChild::CDialogChild(CWnd* pParent /*=NULL*/)
: CDialog(CDialogChild::IDD, pParent) , //more variables,
m_iDefaultDesktopSizeX(GetSystemMetrics(SM_CXSCREEN)), m_iDefaultDesktopSizeY(GetSystemMetrics(SM_CYSCREEN))
{
//...
}
我的分辨率是1366x768,我在Visual Studio 2013调试器中得到的数字各不相同,从“无法访问内存”到数百万

然后我决定尝试在构造函数中初始化它们,而不是在初始化列表中。我从两个变量的头中删除了“const”关键字,然后我想我会将它们的值打印到调试输出。这是我的代码(我知道它不那么优雅,但仍在计算MFC约定):

#ifdef UNICODE
typedef std::wstringstream tstringstream;
#否则
typedef std::stringstream tstringstream;
#恩迪夫
m_iDefaultDesktopSizeX=GetSystemMetrics(SM_CXSCREEN);
m_iDefaultDesktopSizeY=GetSystemMetrics(SM_CYSCREEN);
#ifdef输出\u调试\u字符串
tstringstream ss1;
tstringstream ss2;
ss1>sizeX;
ss2>src1;
ss2>>src2;
//1000是一个神奇的数字
StringCchCat(目的地,1000,src1);
StringCchCat(dest,1000,_T(“和m_iDefaultDesktopSizeY=”);
StringCchCat(目的地,1000,src2);
OutputDebugString(dest);
#恩迪夫
当我运行它时,在“ss2>>src2”上抛出一个异常,表示访问冲突写入[hex address]

那么,发生了什么,我应该提供什么更多的信息?我遇到的问题是在我对另一个问题进行故障排除的过程中,因此对其中一个或两个问题的帮助将是非常棒的

编辑

由于Mark的评论,我将所有LPTSTR变量的初始化更改为“new TCHAR()”,从而解决了这个特定问题。我能够在调试输出中运行字符串,它显示了正确的分辨率(即使在VS调试器中它本身是错误的),所以非常感谢!即使我将变量放回构造函数初始化列表并再次将其设置为“const”,这仍然有效:)

然而,我现在得到一个新的错误。虽然这最终不是在这个#ifdef块中发生的问题,但我现在遇到的错误可能会在我编写的其他代码中出现

守则:

tstringstream ss1;
tstringstream ss2;

ss1 << m_iDefaultDesktopSizeX;
//stream >> sizeX;

ss2 << m_iDefaultDesktopSizeY;

LPTSTR dest = new TCHAR();
StringCchCat(dest, 300, _T("\nm_iDefaultDesktopSizeX = "));
LPTSTR src1 = new TCHAR();
LPTSTR src2 = new TCHAR();

ss1 >> src1;
ss2 >> src2;


StringCchCat(dest, 300, src1);
StringCchCat(dest, 300, _T(" and m_iDefaultDesktopSizeY = "));
StringCchCat(dest, 300, src2);
OutputDebugString(dest);

//error happens on the line below this one!!!!
delete dest;
dest = 0;
delete  src1;
src1 = 0;
delete  src2;
src2 = 0;
tstringstreamss1;
tstringstream ss2;
ss1>sizeX;
ss2>src1;
ss2>>src2;
StringCchCat(目的地,300,src1);
StringCchCat(dest,300,_T(“和m_iDefaultDesktopSizeY=”);
StringCchCat(目的地,300,src2);
OutputDebugString(dest);
//错误发生在这一行下面!!!!
删除dest;
dest=0;
删除src1;
src1=0;
删除src2;
src2=0;

当运行时到达delete命令并且.exe文件触发了断点时,会发生此错误

该错误很可能是由代码中的缓冲区溢出引起的,例如:

LPTSTR dest = new TCHAR();
StringCchCat(dest, 300, _T("\nm_iDefaultDesktopSizeX = "));
第一行分配一个字符,然后在第二行写大约20-30个字符

不用担心原始字符串指针,只需使用CString或std::wstring:

tstringstream ss1;
tstringstream ss2;

ss1 << m_iDefaultDesktopSizeX;
ss2 << m_iDefaultDesktopSizeY;

CString dest = _T("\nm_iDefaultDesktopSizeX = ");
dest += ss1.str().c_str();
dest += _T(" and m_iDefaultDesktopSizeY = ");
dest += ss2.str().c_str();

OutputDebugString(dest);
tstringstreamss1;
tstringstream ss2;

ss1该错误很可能是由代码中的缓冲区溢出引起的,例如:

LPTSTR dest = new TCHAR();
StringCchCat(dest, 300, _T("\nm_iDefaultDesktopSizeX = "));
第一行分配一个字符,然后在第二行写大约20-30个字符

不用担心原始字符串指针,只需使用CString或std::wstring:

tstringstream ss1;
tstringstream ss2;

ss1 << m_iDefaultDesktopSizeX;
ss2 << m_iDefaultDesktopSizeY;

CString dest = _T("\nm_iDefaultDesktopSizeX = ");
dest += ss1.str().c_str();
dest += _T(" and m_iDefaultDesktopSizeY = ");
dest += ss2.str().c_str();

OutputDebugString(dest);
tstringstreamss1;
tstringstream ss2;

ss1您的
ss2>>src2
正在尝试写入零长度只读字符串文字;您需要一个字符缓冲区。您可能正在运行发布版本,因此调试器会给您提供虚假的值。另外,我会使用
系统参数sinfo
SPI\u GETWORKAREA
来代替。非常感谢。我将src1、src2和dest变量的初始化更改为使用“new TCHAR()”,这确实修复了访问冲突错误。我正在运行一个调试版本,该产品从未发布(它被搁置)。谢谢你的提醒,我查过了。我会查系统参数的,谢谢马克!你的第一个解决方案对我来说似乎很好,而且在这里非常有效。问题出在你的调试代码上。迈克尔,你能扩展一下吗?我做了更多的搜索。原来,它是在释放模式!我通过配置管理器将其切换回调试模式,现在调试器像老板一样工作。非常感谢!您的
ss2>>src2
正在尝试写入零长度只读字符串文字;您需要一个字符缓冲区。您可能正在运行发布版本,因此调试器会给您提供虚假的值。另外,我会使用
系统参数sinfo
SPI\u GETWORKAREA
来代替。非常感谢。我将src1、src2和dest变量的初始化更改为使用“new TCHAR()”,这确实修复了访问冲突错误。我正在运行一个调试版本,该产品从未发布(它被搁置)。谢谢你的提醒,我查过了。我会查系统参数的,谢谢马克!你的第一个解决方案对我来说似乎很好,而且在这里非常有效。问题出在你的调试代码上。迈克尔,你能扩展一下吗?我做了更多的搜索。原来,它是在释放模式!我通过配置管理器将其切换回调试模式,现在调试器像老板一样工作。非常感谢!这听起来很有希望。如上所述,我对MFC不太熟悉,虽然我对规则C++很熟悉。MFC是否将CString隐式地无缝转换为LPTSTR(例如OutputDebugString()需要一个LPCTSTR)?谢谢!您需要将它从std::string更改为c_字符串,因为MFC无法将其转换为TCHAR*或CString?我不确定您所说的c_字符串是什么意思。你是说电话铃?您可以使用CSt或CSt