Windows 7 を使用しており、プログラムの 64 ビット バージョンと 32 ビット バージョンがあります。32 ビット バージョンは問題なく動作しますが、64 ビット バージョンでは実行時に問題が発生します。リスト ビュー アイテムを作成し、列に自分の情報を入力しています。それらはすべて印刷されていますが、1 つが正しく印刷されていません。これは印刷されているものです (写真がないことをお詫びしますが、新しいメンバーとして写真を投稿することはできません):
トラック
ÍÍÍÍHRZ141
ÍÍÍÍHRZ152
実際に表示したい情報の前に4つのnull文字を配置しているようです。さらに調べてみると、アドレス指定が間違っているように見えます。エラーが発生しているコードのセクションは次のとおりです。
Audit * audit = (Audit *)plvdi->item.lParam;
switch(plvdi->item.iSubItem)
{
case 0:
{
plvdi->item.pszText = audit->Truck;
while(plvdi->item.pszText[0] != 'H')
{
plvdi->item.pszText++;
}
}
return true;
私のトラック名はすべて H で始まるため、これは一時的な修正です。plvdi->item.psz テキストはリスト ビュー アイテムのテキスト表示であり、audit->Truck は char[] です。次のように簡単にする必要があります。
sprintf(plvdi->item.pszText, audit->Truck);
しかし、それはうまくいかないようです。それは私に同じエラーを残します。実行すると、アドレス plvdi->item.pszText は、割り当てステートメント (while ステートメントのブレークポイント) の後、audit->Truck のアドレスよりも 4 バイト少なく、これが 4 つの null 文字を引き起こしていると思われます。私が投稿したような回避策なしでこの問題を解決する方法、なぜこれが起こっているのか、そしてなぜ 64 ビット ソリューションでのみなのか、私にはよくわかりません。この件についてご協力いただきありがとうございます。
編集:私のプログラム内で見つけた他の同様の問題から、ポインタと関係があるようです。選択ベクトルの後に来る監査クラスのすべてに問題があり、4 バイトずれているように見えました。別のクラスでは、Audit へのポインターの後に来るすべてが失敗し、文字列 (技術的には char 配列へのポインター) にも問題があることがわかりました。ポインターを持つ要素をヘッダー ファイルのクラスの最後に移動すると、すべて正常に動作するように見えました。文字列、ベクトル、またはその他の同様の構造に、32 ビット システムまたは 64 ビット システムに依存するポインターがあるかどうか、何か考えはありますか?