Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ VS2010 x64:64位平台VS2010中包含错误数据的对象数组_C++_Visual Studio 2010_Visual C++_32bit 64bit_Porting - Fatal编程技术网

C++ VS2010 x64:64位平台VS2010中包含错误数据的对象数组

C++ VS2010 x64:64位平台VS2010中包含错误数据的对象数组,c++,visual-studio-2010,visual-c++,32bit-64bit,porting,C++,Visual Studio 2010,Visual C++,32bit 64bit,Porting,我正在VS2010中将32位代码移植到64位代码。我的应用程序在尝试启动其中一个对话框时崩溃,但我发现它在32位配置下工作得很好,但在64位配置下却不能。我发现有一个包含字符数组的对象数组,在64位平台中数据不正确。例如,假设有一个字符串列表:红色、黑色……在32位中,列表显示正确,但在64位中,第二个对象的字符指针指向黑色的k,即比实际数据提前4个字节。在32位平台中,对象大小为144字节,但在64位平台中,每个对象的大小为148字节 BOOL SomeDlg::OnInitDialog( H

我正在VS2010中将32位代码移植到64位代码。我的应用程序在尝试启动其中一个对话框时崩溃,但我发现它在32位配置下工作得很好,但在64位配置下却不能。我发现有一个包含字符数组的对象数组,在64位平台中数据不正确。例如,假设有一个字符串列表:红色、黑色……在32位中,列表显示正确,但在64位中,第二个对象的字符指针指向黑色的k,即比实际数据提前4个字节。在32位平台中,对象大小为144字节,但在64位平台中,每个对象的大小为148字节

BOOL SomeDlg::OnInitDialog( HWND hwnd, HWND hwndFocus, LPARAM lParam )
{
   MEMBERASSERT();
   CABCDialog::OnInitDialog( hwnd, hwndFocus, lParam );

   int nHeight = ListBox_GetItemHeight( GetDlgItem(hwnd, IDC_DUMMYLIST),    -1 );
   m_myLst.SetItemHeight(-1, nHeight);
   m_ClrLst.SetItemHeight(-1, nHeight);

   char smyItem[64];
   for (UINT i=0; i < 10; i++)
   {

      LoadString(g_hInstance, IDS_COLORNAMES+i, smyItem, ELEMENTS_IN(smyItem));
      m_ZAItems[i].SetColor(m_pSettings->m_rgbColors[i]);
      m_ZAItems[i].SetText(smyItem);

    //debug issue, check size of object
      int a = sizeof(m_ZAItems[i]);
      m_myLst.AddItem( &m_ZAItems[i] );
    }

//some other stuff
}

  class SomeDlg : public CABCDialog
   {
   private:
      MyDrwaLstBox m_myLst;
      My_ColorComboBox    m_ClrLst;
      My_ColorText  m_ZAItems[11];


   private:    
   SomeDlg();
   SomeDlg(const SomeDlg &);
   const SomeDlg &operator=(const SomeDlg &);


  public:   
     SomeDlg(HWND hwndZW, MCURRENT* pSettings , LPCSTR szName );
     virtual void Notification( ADM_Wnd *pWnd, UINT uID, int nNotificationCode, LPARAM lData );
    virtual BOOL OnInitDialog( HWND hwnd, HWND hwndFocus, LPARAM lParam );
  };

class MyDrwaLstBox : public MY_ListBox
{
protected:
   BOOL                          m_bpmn;
private:
                             MyDrwaLstBox( const  MyDrwaLstBox& );
   const MyDrwaLstBox &  operator=( const MyDrwaLstBox & );

public:
                             MyDrwaLstBox ();
   virtual void                  OnDrawItem( HWND hwnd,
                                         const DRAWITEMSTRUCT * lpDrawItem );
};


class My_ColorText : public My_Color
{
private:                                 
   enum { txtLen = 128 };    
   TCHAR m_szText[ txtLen ]; 

   My_ColorText ( const My_ColorText  & );
   const My_ColorText  &operator=( const My_ColorText  & );


public:
   My_ColorText ();
   My_ColorText ( COLORREF rgbColor, LPCTSTR pszText );

   void SetText( LPCTSTR pszText );
   void SetText( HINSTANCE hInstance, UINT uID );
   LPCTSTR GetText();

   virtual void Draw( HDC hDC, RECT rRect, BOOL bChecked, BOOL bDisabled,
                  BOOL bFocus, BOOL bGrayed, BOOL bSelected );
};

My_ColorText::My_ColorText()
{   
   m_szText[0] = '\0';
}

My_ColorText::My_ColorText( COLORREF rgbColor, LPCTSTR pszText )
 : My_Color( rgbColor )
{
   MDC_strncpyz( m_szText, pszText );
}

void My_ColorTex::SetText( LPCTSTR pszText )
{
  MDC_strncpyz( m_szText, pszText );
}

void My_ColorText::SetText( HINSTANCE hInstance, UINT uID )
{
  *m_szText = '\0';
  LoadString( hInstance, uID, m_szText, ELEMENTS_IN( m_szText ) );
}

LPCTSTR My_ColorText::GetText()
{
  return m_szText;
}

template <size_t size>
LPSTR MDC_strncpyz(CHAR (&dest)[size], LPCSTR srce) { return MDC_strncpyz(dest, srce, size); }


class My_Color : public My_DrawItem
{
private:
   COLORREF                   m_rgbColor;

private:
                          My_Color( const My_Color & );
  const My_Color &    operator=( const My_Color & );

public:
                          My_Color( void );
                          My_Color( COLORREF rgbColor );

  virtual void               Draw( HDC hDC, 
                                RECT rRect,
                                BOOL bChecked,
                                BOOL bDisabled,
                                BOOL bFocus,
                                BOOL bGrayed,
                                BOOL bSelected );
};

My_Color::My_Color void )
 : m_rgbColor( RGB_BLACK )
{
}

My_Color::My_Color( COLORREF rgbColor )
 : m_rgbColor( rgbColor )
{
}

 class My_DrawItem
{
protected:                             
   BOOL                       m_bInListBox;                              
   DWORD                      m_dwUser;
private:
                          My_DrawItem( const My_DrawItem & );
const My_DrawItem &  operator=( const My_DrawItem & );

public:
                          My_DrawItem();
virtual                    ~My_DrawItem();
virtual void               Draw( HDC hDC, 
                                RECT rRect,
                                BOOL bChecked,
                                BOOL bDisabled,
                                BOOL bFocus,
                                BOOL bGrayed,
                                BOOL bSelected );
};

My_DrawItem::My_DrawItem()
 : m_bInListBox( FALSE ),
m_dwUser( 0 )
{
}
BOOL SomeDlg::OnInitDialog(HWND-HWND,HWND-hwndFocus,LPARAM-LPARAM)
{
MEMBERASSERT();
CABCDialog::OnInitDialog(hwnd、hwndFocus、LPRAM);
int nHeight=ListBox\u GetItemHeight(GetDlgItem(hwnd,IDC\u DUMMYLIST),-1);
m_myLst.SetItemHeight(-1,nHeight);
m_ClrLst.SetItemHeight(-1,nHeight);
char-smyItem[64];
对于(UINT i=0;i<10;i++)
{
LoadString(g_hInstance,id_COLORNAMES+i,smyItem,ELEMENTS_IN(smyItem));
m_ZAItems[i].SetColor(m_pSettings->m_rgbColors[i]);
m_ZAItems[i].SetText(smyItem);
//调试问题,检查对象的大小
int a=尺寸f(m_ZAItems[i]);
m_myLst.AddItem(&m_ZAItems[i]);
}
//一些其他的东西
}
课程名称:公共电缆对话
{
私人:
MyDrwaLstBox m_myLst;
我的颜色组合框m_ClrLst;
My_ColorText m_ZAItems[11];
私人:
SomeDlg();
SomeDlg(const SomeDlg&);
常量SomeDlg&运算符=(常量SomeDlg&);
公众:
SomeDlg(HWND hwndZW、MCURRENT*pSettings、LPCSTR szName);
虚拟无效通知(ADM_Wnd*pWnd、UINT uID、int nNotificationCode、LPARAM lData);
虚拟BOOL-OnInitDialog(HWND-HWND、HWND-hwnfocus、LPARAM-LPARAM);
};
类MyDrwaLstBox:公共MY_列表框
{
受保护的:
布尔m_bpmn;
私人:
MyDrwaLstBox(const MyDrwaLstBox&);
常量MyDrwaLstBox&运算符=(常量MyDrwaLstBox&);
公众:
MyDrwaLstBox();
虚拟空拆项目(HWND HWND,
常量DRAWITEMSTRUCT*lpDrawItem);
};
类My_颜色文本:公共My_颜色
{
私人:
枚举{txtLen=128};
TCHAR m_szText[txtLen];
My_ColorText(const My_ColorText&);
const My_ColorText&运算符=(const My_ColorText&);
公众:
My_ColorText();
我的彩色文本(COLORREF rgbColor、LPCTSTR pszText);
void SetText(LPCTSTR pszText);
void SetText(HINSTANCE HINSTANCE,UINT uID);
LPCTSTR GetText();
虚拟空位绘制(HDC HDC、RECT RECT、BOOL B检查、BOOL B禁用、,
BOOL bFocus、BOOL bGrayed、BOOL bSelected);
};
My_ColorText::My_ColorText()
{   
m_szText[0]='\0';
}
My_ColorText::My_ColorText(COLORREF rgbColor、LPCTSTR pszText)
:我的颜色(RGB颜色)
{
MDC_strncpyz(m_szText,pszText);
}
void My_ColorTex::SetText(LPCTSTR pszText)
{
MDC_strncpyz(m_szText,pszText);
}
void My_ColorText::SetText(HINSTANCE HINSTANCE,UINT uID)
{
*m_szText='\0';
LoadString(hInstance、uID、m_szText、m_szText中的元素);
}
LPCTSTR My_ColorText::GetText()
{
返回m_szText;
}
模板
LPSTR MDC_strncpyz(CHAR(&dest)[size],LPCSTR srce){返回MDC_strncpyz(dest,srce,size);}
类别My_颜色:公共My_DrawItem
{
私人:
COLORREF m_RGB颜色;
私人:
我的颜色(const My_Color&);
const My_Color&运算符=(const My_Color&);
公众:
我的颜色(空白);
我的颜色(COLORREF rgbColor);
虚拟空洞绘制(HDC HDC,
更正,
布尔检查,
布尔被禁止,
布尔·布福克斯,
布尔·布格莱德,
布尔(当选);
};
我的颜色::我的颜色无效)
:m_RGB颜色(RGB_黑色)
{
}
我的颜色::我的颜色(COLORREF rgbColor)
:m_rgb颜色(rgb颜色)
{
}
将My_DrawItem分类
{
受保护的:
布尔m_bInListBox;
德沃德·穆杜瑟;
私人:
My_DrawItem(const My_DrawItem&);
常量My_DrawItem&运算符=(常量My_DrawItem&);
公众:
My_DrawItem();
虚拟~My_DrawItem();
虚拟空洞绘制(HDC HDC,
更正,
布尔检查,
布尔被禁止,
布尔·布福克斯,
布尔·布格莱德,
布尔(当选);
};
My_DrawItem::My_DrawItem()
:m_bInListBox(假),
m_dwUser(0)
{
}
“SomeDlg”类包含My_ColorComboBox类的对象,而My_ColorText类的对象又包含My_ColorText类的对象数组。 当My_ColorText类的构造函数通过My_ColorComboBox类调用时,m_ColorItems[0]的m_szText和m_ColorItems[1]的m_szText的基址之差等于152字节。表示My_ColorText()构造函数为m_szText变量分配的基址相差152字节。 但当My_ColorText类gest的构造函数通过SomeDlg类调用时,m_ZAItems[0]的m_szText和m_ZAItems[1]的m_szText的基址之差等于148字节。因此,字符串没有被插入到152字节差的正确位置


当我检查sizeof(My_ColorText)时,在这两种情况下,它都会给我152个字节。

我在堆上创建了对象,而不是在堆栈上创建。 下面的几行已经添加了解决问题的代码

for (UINT i=0; i < 10; i++)
{
   LoadString(g_hInstance, IDS_COLORNAMES+i, smyItem, ELEMENTS_IN(smyItem));
   //m_ZAItems[i].SetColor(m_pSettings->m_rgbColors[i]);
   //m_ZAItems[i].SetText(smyItem);

   myLst.AddItem( new  My_ColorText( m_pSettings->m_rgbColors[i], smyItem ) );
}
for(UINT i=0;i<10;i++)
{
装载字符串(g_hInsta