ホーム » VC (ページ 11)
「VC」カテゴリーアーカイブ
C2061
既存のプロジェクトで,::To_tstring(const P2&…) を追加したら,
——————–構成: BLCombi – Win32 Debug——————–
コンパイル中…
ComPrj01.cpp
c:\…\vc98\include\memory(16) : error C2061: 構文エラー : 識別子 ‘THIS_FILE’ がシンタックスエラーを起こしました。
c:\…\vc98\include\memory(17) : error C2091: 関数は関数を返せません。
c:\…\vc98\include\memory(17) : error C2809: ‘operator new’ に仮引数リストがありません。
c:\…\vc98\include\memory(20) : error C2954: テンプレートの定義はネストできません。
c:\…\…..\blocklsv.cpp(398) : error C2678: 二項演算子 ‘+’ : 型 ‘class std::basic_string …’ の
左オペランドを扱う演算子は定義されていません。(または変換できません)(新しい動作; ヘルプを参照)
cl.exe の実行エラー
ComPrj01.obj – エラー 5、警告 0
本来の対応は別の所にありそうだが,ComPrj01.cpp の先頭に #include <memory> を追加した.
#include “StdAfx.h”
#include “ComPrj00.hpp”
#include <memory>
…
VC 6 で _UNICODE
VC 6 コンソール AP で,_UNICODE を付加してビルドすると
——————–構成: T_F_Stat – Win32 ReleaseU——————–
コンパイル中…
T_F_Stat.cpp
C:\…\VC98\INCLUDE\winnt.h(195) : error C2371: ‘LPTSTR’ : 再定義されています。異なる基本型です。
C:\…\Develop\_.SRC\__CPR_\tstring.hxx(33) : ‘LPTSTR’ の宣言を確認してください。
C:\…\VC98\INCLUDE\winnt.h(196) : error C2371: ‘LPCTSTR’ : 再定義されています。異なる基本型です。
C:\…\Develop\_.SRC\__CPR_\tstring.hxx(34) : ‘LPCTSTR’ の宣言を確認してください。
C:\…\Develop\_.SRC\__Mlt_\Get_Path.hxx(64) : error C2664: ‘GetCurrentDirectoryA’ :
2 番目の引数を ‘unsigned short *’ から ‘char *’ に変換できません。 (新しい機能 ; ヘルプを参照)
指示された型は関連がありません; 変換には reinterpret_cast、 C スタイル キャストまたは関数スタイルのキャストが必要です。
C:\…\Develop\_.SRC\__Mlt_\Get_Path.hxx(91) : error C2664: ‘GetLongPathNameA’ :
1 番目の引数を ‘const unsigned short *’ から ‘const char *’ に変換できません。 (新しい機能 ; ヘルプを参照)
指示された型は関連がありません; 変換には reinterpret_cast、 C スタイル キャストまたは関数スタイルのキャストが必要です。
C:\…\Develop\_.SRC\__Mlt_\Get_Path.hxx(114) : error C2664: ‘GetTempPathA’ :
2 番目の引数を ‘unsigned short *’ から ‘char *’ に変換できません。 (新しい機能 ; ヘルプを参照)
指示された型は関連がありません; 変換には reinterpret_cast、 C スタイル キャストまたは関数スタイルのキャストが必要です。
C:\…\Develop\_.SRC\__Win\HelpWAPI.hxx(107) : error C2664: ‘GetModuleFileNameA’ :
2 番目の引数を ‘unsigned short *’ から ‘char *’ に変換できません。 (新しい機能 ; ヘルプを参照)
指示された型は関連がありません; 変換には reinterpret_cast、 C スタイル キャストまたは関数スタイルのキャストが必要です。
C:\…\Develop\_.SRC\__Win\HelpWAPI.hxx(143) : error C2664: ‘GetComputerNameA’ :
1 番目の引数を ‘unsigned short *’ から ‘char *’ に変換できません。 (新しい機能 ; ヘルプを参照)
指示された型は関連がありません; 変換には reinterpret_cast、 C スタイル キャストまたは関数スタイルのキャストが必要です。
C:\…\Develop\_.SRC\__Win\HelpWAPI.hxx(163) : error C2664: ‘GetUserNameA’ :
1 番目の引数を ‘unsigned short *’ から ‘char *’ に変換できません。 (新しい機能 ; ヘルプを参照)
指示された型は関連がありません; 変換には reinterpret_cast、 C スタイル キャストまたは関数スタイルのキャストが必要です。
cl.exe の実行エラー
T_F_Stat.exe – エラー 8、警告 0
tstring.h で LPxTSTR の定義は次の様にしていた.
#ifdef _MSC_VER
typedef TCHAR* LPTSTR ;
typedef const TCHAR* LPCTSTR ;
#else
typedef char* LPTSTR ;
typedef const char* LPCTSTR ;
#endif
対応方法がわからず,#include <Afx.h> を追加すると通る様にはなった.
_UNICODE だけでなく UNICODE も追加すると,Afx.h なしでも通る様になった.
2020/09 コンソール AP での define
fopen と sopen
_tfopen と _tsopen の mode の関係がわからなかったので,コードを抜粋
(VS8)\VC\crt\src\_open.c より
/* First mode character must be ‘r’, ‘w’, or ‘a’. */
switch (*mode) {
case _T(‘r’):
modeflag = _O_RDONLY;
streamflag |= _IOREAD;
break;
case _T(‘w’):
modeflag = _O_WRONLY | _O_CREAT | _O_TRUNC;
streamflag |= _IOWRT;
break;
case _T(‘a’):
modeflag = _O_WRONLY | _O_CREAT | _O_APPEND;
streamflag |= _IOWRT;
break;
default:
_VALIDATE_RETURN((“Invalid file open mode”,0), EINVAL, NULL);
}
C2146
次の様なコードで,C2146 , C2065
private: System::Void Form1_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) {
Size cr = this->ClientSize ;
Point lt = Point(cr.Width/3*1,cr.Height/3*1) ;
Point rb = Point(cr.Width/3*2,cr.Height/3*2) ;
array<Point>^ pts = gcnew array<Point>(5) ;
{
pts->SetValue(gcnew Point(lt.X,lt.Y),0) ;
pts->SetValue(gcnew Point(lt.X,rb.Y),1) ;
pts->SetValue(gcnew Point(rb.X,rb.Y),2) ;
pts->SetValue(gcnew Point(rb.X,lt.Y),3) ;
pts->SetValue(gcnew Point(lt.X,lt.Y),4) ;
}
e->Graphics->DrawLines(gcnew Pen(Color::Red),pts) ;
}
private: System::Void Form1_SizeChanged(System::Object^ sender, System::EventArgs^ e) {
this->Invalidate() ;
}
—— ビルド開始: プロジェクト: DrwLines, 構成: Debug Win32 ——
コンパイルしています…
DrwLines.cpp
c:\…\drwlines\Form1.h(75) : error C2146: 構文エラー : ‘;’ が、識別子 ‘cr’ の前に必要です。
c:\…\drwlines\Form1.h(75) : error C2065: ‘cr’ : 定義されていない識別子です。
c:\…\drwlines\Form1.h(76) : error C2228: ‘.Width’ の左側はクラス、構造体、共用体でなければなりません
型は ”unknown-type” です。
c:\…\drwlines\Form1.h(76) : error C2228: ‘.Height’ の左側はクラス、構造体、共用体でなければなりません
型は ”unknown-type” です。
c:\…\drwlines\Form1.h(77) : error C2228: ‘.Width’ の左側はクラス、構造体、共用体でなければなりません
型は ”unknown-type” です。
c:\…\drwlines\Form1.h(77) : error C2228: ‘.Height’ の左側はクラス、構造体、共用体でなければなりません
型は ”unknown-type” です。
ビルドログは “file://c:\…\DrwLines\Debug\BuildLog.htm” に保存されました。
DrwLines – エラー 6、警告 0
========== ビルド: 0 正常終了、1 失敗、2 更新、0 スキップ ==========
Drawing::Size とすることにより通る様になるが,イマイチどの様に書くべきかが理解できてない.
DrawLines についても,よくわかってない.array<Point>^ の array って何?
ここの説明がわかりやすい.
pts->SetValue(gcnew Point(lt.X,lt.Y),0) ; の gcnew はいらない?
関数の引数の const ~ & はどこへ?
printf や CString::Format の “%10.3f” の様な形式
String::Format で “{0,10:F3}”
C:\…\HelpPnt.hxx(72) : error C3083: ‘Drawing’: ‘::’ の左側のシンボルには、型を指定しなければなりません
C:\…\HelpPnt.hxx(72) : error C2039: ‘Point’ : ‘System’ のメンバではありません。
C:\…\HelpPnt.hxx(72) : error C2065: ‘Point’ : 定義されていない識別子です。
#using <System.Drawing.dll> を追加
CLI
今度は,C++/CLI .
以前作成した MFC プロジェクト MemStt を変更.
Release 版プロジェクトのプロパティで,
「構成プロパティ」-「全般」-「共通言語ランタイム…」を「/clr」に.
ビルドすると確かにファイルサイズは大きくなる.
Debug 版だと,
cl : コマンド ライン error D8016 : コマンド ライン オプション ‘/RTC1’ と ‘/clr’ は同時に指定できません
正しい対応方法はわからないが,vcproj をエディタで開いて,BasicRuntimeChecks=”3″ を削除.
Form クラスに MemoryStatusAry を確保すると,
c:\~\Form1.h(26) : error C4368: ‘MemSA’ をマネージ ‘MemSF::Form’ のメンバとして定義できません。
MemoryStatusAry* MemSA とすることで対応?
VC 7 で error C2664 std::vector
VC 6 では通っていたが,VC 7 でエラーとなってそのままだったコード.
std::vector <void*> voidPtrs(1024,NULL) ;
c:\Program Files\Microsoft Visual Studio .NET\Vc7\include\vector(124) : error C2664:
‘std::vector >::_Construct_n’ : 2 番目の引数を ‘int’ から ‘void *const & ‘ に変換できません。
理由: ‘int’ から ‘void *const ‘ へは変換できません。
整数型からポインタ型への変換には reinterpret_cast、C スタイル キャストまたは関数スタイル キャストが必要です。
c:\Program Files\Microsoft Visual Studio .NET\Vc7\include\vector(109) :
コンパイルされたクラスのテンプレートのインスタンス化 ‘void std::vector<_Ty,_Ax>::_Construct(_Iter,int,std::_Int_iterator_tag)’ の参照を確認してください
with
[
_Ty=void *,
_Ax=std::allocator,
_Iter=int
]
c:\~\~.cpp(206) : コンパイルされたクラスのテンプレートのインスタンス化
‘std::vector<_Ty,_Ax>::vector(_Iter,int)’ の参照を確認してください
with
[
_Ty=void *,
_Ax=std::allocator,
_Iter=int
]
(void*) とすることで通るみたい.
std::vector <void*> voidPtrs(1024,(void*)NULL) ;
MFC と STL – 2
Xml_E で,MFC を使用しない様に変更中.
XML のデータを用意して,以下の様に単純に 100 個の配列にコピーする時間を計測しようとした.
ElapseTick et ;
CArray xmlAry ; // std::vector xmlAry ;
for (int index=0 ; index<100 ; index++) {
xmlAry.Add(Xml_Data) ; // xmlAry.push_back(Xml_Data) ;
}
CString etStr = ::ToString(et.GetElapse()/1000.0) ;
m_CtrlResult.SetWindowText(etStr) ;
データによっては期待した結果(MFC 版と同等またはそれより高速)が出たが,
この SVG を使用してメモリが少ない環境では極端に遅くなってしまった.
そこで,それぞれのサイズを調べてみた.
VC 6 | VC 7 | VC 8 | VC 9 | VC 10 | VC 8 Debug | VC 9 Debug | VC 10 Debug | VC 8 x64 | VC 9 x64 | VC 10 x64 | VC 9 x64 Debug | VC10 x64 Debug | Xcode 64 Debug | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
CString | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 8 | 8 | 8 | 8 | 8 | |
CArray | 20 | 20 | 20 | 20 | 20 | 20 | 20 | 20 | 40 | 40 | 40 | 40 | 40 | |
tstring | 16 | 28 | 28 | 28 | 28 | 32 | 32 | 32 | 40 | 40 | 40 | 48 | 48 | 8 |
vector | 16 | 16 | 16 | 24 | 16 | 20 | 20 | 20 | 32 | 48 | 32 | 40 | 40 | 24 |
Xml_E | 68 | 92 | 92 | 108 | 92 | 108 | 108 | 108 | 152 | 184 | 152 | 184 | 184 | 72 |
tstring は,std::string または std::wstring .
vector は, <int> のサイズ.sizeof (std::vector<bool>) は vector<int> などより大きくなることがあるみたい.
Xml_E の MFC 版のデータメンバは,
CString Name , CString Text , CArray<Xml_Attribute,Xml_Attribute> Attribute , CArray<Xml_E,Xml_E> Child .
STL 版は tstring と std::vector に置換えた.
MFC Xml_Attribute | 12 | 4 + 4*2 |
MFC Xml_E | 52 | 4 + 4*2 + 20*2 |
STL Xml_Attribute | 36 | 4 + 16*2 |
STL Xml_E | 68 | 4 + 16*2 + 16*2 |
2013/04/22
SVG の全要素数は 5,557 ,属性は 19,103 .MFC 版では 518,200 ,STL 版では 1,065,584 となる.
つまり 50 M ~ 100 M 位が一時的に必要となってしまっていた(200 個にした時もあり).
ループ部分を 2 重ループとして,内側を 10 で 10 個の配列が必要となる様に改良.
時間を計測すると環境にもよるがほぼ同等の結果が得られた,
T5400 では MFC 6 秒と STL 3 秒.
MFC と STL
MFC | STL |
---|---|
CString::Right など | string::substr |
LPCTSTR | string::c_str |
LPTSTR CString::GetBuffer() | - |
CString::ReverseFind() | string::rfind |
- | string::find_last_not_of |
Xcode で,#include “..\Test\Test.h” は通らない?
バックスラッシュではなく通常のスラッシュ ‘/’ とすれば OK (VC 6 でも通る).
2013/03/04
CString::GetBuffer() にあたる部分を,string::begin() とすると VC 6 では通る(たまたま通っているだけ).
#ifdef _MBCS
{
// tstring tmpStr = str + _T(“”) ;
// _tcsrev(tmpStr.begin()) ;
std::vector tmpStr ;
tmpStr.resize(str.length()+1) ;
_tcscpy(&tmpStr[0],str.c_str()) ;
_tcsrev(&tmpStr[0]) ;
// ….
}
#endif
昨日立ち読みした方法に改良.確かこんなんだったと思う.
2013/03/07
VC 7 でコンパイルすると,
c:\…\Test.cpp(45) : error C2664: ‘_tcsrev’ :
1 番目の引数を ‘std::basic_string::iterator’ から ‘char *’ に変換できません。
error C2065 _lpa
T2OLE を利用したら,
——————–構成: Test – Win32 Debug——————–
コンパイル中…
Test.cpp
C:\…\Test.cpp(81) : error C2065: ‘_lpa’ : 定義されていない識別子です。
C:\…\Test.cpp(81) : error C2440: ‘=’ : ‘char *’ から ‘int’ に変換することはできません。(新しい動作 ; ヘルプを参照)
この変換には reinterpret_cast, C スタイル キャストまたは関数スタイルのキャストが必要です。
C:\…\Test.cpp(81) : error C2065: ‘_convert’ : 定義されていない識別子です。
cl.exe の実行エラー
Test.exe – エラー 3、警告 0
USES_CONVERSION; の指定がないとこれらのエラーが出力される.
テクニカル ノート 59
他に,今回テストに利用したサンプルで IID_PPV_ARGS が未定義となった.
動作確認が目的なので,c:\…\v7.0A\Include\ObjBase.h より対象部分の数行をコピーして利用.
COM のコーディング プラクティス
operator[]
以下の様なコードで,配列の要素として書き戻す部分がうまく機能してなかった.
BOOL d3D_PgonsA::SetUniqueName (void) {
{ // 空の場合 “Pgons_0x” を設定
for (int index=0 ; index<this->GetCount() ; index++) {
d3D_Pgons1 pgons = (*this)[index] ;
CString name = pgons.GetName().c_str() ;
if (name.IsEmpty()) {
name.Format(_T(“Pgons1_%03d”),index+1) ;
pgons.SetName(name) ;
(*this)[index] = pgons ;
continue ;
}
}
}
// …
}
原因は, d3D_Pgons1& operator[] (const int index) が定義されてなかったためだが,未だによくわかってない.
MemStat.hxx
Xcode や VC , W Mobile で可能な様にコードを書いてみた.
#ifndef MemStat_hxx
#define MemStat_hxx
//
#ifdef _WIN32
typedef __int64 i64 ;
typedef unsigned __int64 ui64 ;
#else
typedef long long i64 ;
typedef unsigned long long ui64 ;
#endif
//
#ifdef __APPLE_CC__
#include <mach/mach.h>
#endif
#ifdef _WIN32
#include <Windows.h>
#include <WinBase.h>
#endif
//
class MemoryStatus {
public:
…
} ;
//
…
{
P_Free = P_Total = 0 ;
#ifdef __APPLE_CC__
{
unsigned int count = 0 ;
mach_port_t host_port = ::mach_host_self() ;
host_basic_info_data_t hb_info;
{
count = HOST_BASIC_INFO_COUNT ;
::host_info(host_port,HOST_BASIC_INFO,(host_info_t)&hb_info,&count) ;
}
vm_statistics_data_t vm_info;
{
count = HOST_VM_INFO_COUNT;
::host_statistics(host_port,HOST_VM_INFO,(host_info_t)&vm_info,&count) ;
}
P_Free = vm_info.free_count * vm_page_size ;
P_Total = hb_info.max_mem ;
}
#endif
#ifdef _WIN32
#if !defined(_WIN32_WCE) && (_MFC_VER >= 0x700)
{
MEMORYSTATUSEX memStat ;
memset(&memStat,0,sizeof(MEMORYSTATUSEX)) ;
memStat.dwLength= sizeof(MEMORYSTATUSEX) ;
::GlobalMemoryStatusEx(&memStat) ;
P_Free = memStat.ullAvailPhys ;
P_Total = memStat.ullTotalPhys ;
}
#else
{
MEMORYSTATUS memStat ;
memset(&memStat,0,sizeof(MEMORYSTATUS)) ;
memStat.dwLength= sizeof(MEMORYSTATUS) ;
::GlobalMemoryStatus(&memStat) ;
P_Free = memStat.dwAvailPhys ;
P_Total = memStat.dwTotalPhys ;
}
#endif
#endif
}
//
#endif
ファイルは,UTF-8 と言うか,シフトJIS の設定で,7 bit の範囲の文字のみ使用.
改行は,CR+LF としている.
C1083
—— ビルド開始 : プロジェクト : CalAxByC, 構成 : Debug Win32 ——
コンパイルしています…
StdAfx.cpp
c1xx : fatal error C1083: コンパイラの中間生成物 ファイルを開けません。’ .\Debug.070/CalAxByC.pch’: No such file or directory
CalAxByC – エラー 1、警告 0
———————- 終了 ———————-
ビルド : 0 正常終了、1 失敗、0 スキップ
出力ディレクトリなどの指定で .\$(ConfigurationName).070 の前にスペースが入っていた.
「UNICODE 文字セットを使用する」にすると,
—— ビルド開始 : プロジェクト : CalAxByC, 構成 : Debug Win32 ——
コンパイルしています…
CalAxByC.cpp
リンクしています…
LINK : warning LNK4075: /EDITANDCONTINUE は /INCREMENTAL:NO の指定によって無視されます。
msvcrtd.lib(wcrtexew.obj) : error LNK2019: 未解決の外部シンボル _wWinMain@16 が関数 _wWinMainCRTStartup で参照されました。
.\Debug.070/CalAxByC.exe : fatal error LNK1120: 外部参照 1 が未解決です。
CalAxByC – エラー 2、警告 1
———————- 終了 ———————-
ビルド : 0 正常終了、1 失敗、0 スキップ
この対応方法は vcproj を編集.
コード分析による修正
VC 9
~\CharFnc.hxx(155) : warning C6284: オブジェクトがパラメータ '3' として渡されました。 ~\CharFnc.hxx(155) : warning C6284: オブジェクトがパラメータ '5' として渡されました。 str.Format(_T("(%*s,%*s)"),width, ToString(value.x) ,width, ToString(value.y) ) ; str.Format(_T("(%*s,%*s)"),width,LPCTSTR(ToString(value.x)),width,LPCTSTR(ToString(value.y))) ; 間違って LPCSTR としてしまうと,_UNICODE では error C2440: '' : 'CString' から 'LPCSTR' に変換できません。 LPSTR としてしまうと, error C2440: '' : 'CString' から 'LPSTR' に変換できません。
explorer /e,/select
Explorer.exe コマンドライン オプション
void CDropADlg::OnExecExplorer()
{
UpdateData(TRUE) ;
CString file = m_SelectFile ;
ShellExec se ;
if (::FileIsDirectory(file)) {
se.SetFile(file) ;
}
else {
se.SetNon2QMark(TRUE) ;
se.SetFile(_T(“explorer.exe”)) ;
se.SetParamaters(_T(“/e,/select,”)+file) ;
}
se.Execute() ;
}
xmlns を間違えて 0xE06D7363
xmlns の所を xmlne とタイプミス.そのまま実行して 0xE06D7363.
—————————
Microsoft Visual C++
—————————
ハンドルされていない例外 は T_xml_7.exe (KERNEL32.DLL) にあります: 0xE06D7363: Microsoft C++ Exception。
—————————
OK
—————————
通常の実行の場合は,
—————————
Microsoft Visual C++ Debug Library
—————————
Debug Error!
Program: …NGS\ALL USERS\DOCUMENTS\VC_TEST\SVG\T_xml_7\Debug\T_xml_7.exe
abnormal program termination
(Press Retry to debug the application)
—————————
中止(A) 再試行(R) 無視(I)
—————————
コンパイルで C4786
——————–構成: T_xml_7 – Win32 Debug——————–
コンパイル中…
T_xml_7.cpp
c:\documents and settings\all users\documents\develop\____test\xmlout.hxx(69) : warning C4786: ‘__ehhandler$?Add_Attribute@XmlOut@@SAHV?$_com_ptr_t@V?$_com_IIID@UIXMLDOMDocument@MSXML@@$1?_GUID_2933bf81_7b36_11d2_b20e_00c04f983e60@@3U__s_GUID@@A@@@@
V?$_com_ptr_t@V?$_com_IIID@UIXMLDOMElement@MSXML@@$1?_GUID_2933bf86_7b36_11d2_b20e_00c04f983e60@@3U__s_GUID@@A@@@@PBD2@Z’ : デバッグ情報で識別子が 255 文字に切り捨てられました。
...
リンク中…
T_xml_7.exe – エラー 0、警告 6
コードは以下の部分.
inline
BOOL XmlOut::Add_Attribute (
MSXML::IXMLDOMDocumentPtr pDoc,
MSXML::IXMLDOMElementPtr pEle,
LPCTSTR name,LPCTSTR value)
{
if (pDoc == NULL) { return FALSE ; }
if (pEle == NULL) { return FALSE ; }
MSXML::IXMLDOMAttributePtr pAtt = pDoc->createAttribute(name) ;
pAtt->value = value ;
pEle->setAttributeNode(pAtt) ;
return TRUE ;
}
前後に,
#pragma warning (disable : 4786 )
と
#pragma warning (default : 4786 )
を付加.
DocTh.exe 2011.01.18 0xc0000374
Win7 環境のイベントビューアを見ていたら,エラーがいっぱい.
障害が発生しているアプリケーション名: DocTh.exe、バージョン: 1.10.2012.120、タイム スタンプ: 0x4f16d6f9
障害が発生しているモジュール名: ntdll.dll、バージョン: 6.1.7601.17725、タイム スタンプ: 0x4ec49b8f
例外コード: 0xc0000374
障害オフセット: 0x000ce6c3
障害が発生しているプロセス ID: 0x21cc
障害が発生しているアプリケーションの開始時刻: 0x01ccd71a3cef9b75
障害が発生しているアプリケーション パス: C:\Users\Iwao\AppData\Local\Temp\…\Project\DocTh\Release.060\DocTh.exe
障害が発生しているモジュール パス: C:\Windows\SysWOW64\ntdll.dll
レポート ID: 8e3b520d-430d-11e1-8bec-00219b51e933
AP 終了時に発生しているが,Win7 環境では,特に何も表示されない.
単純に exe を起動して,何もせず終了してもエラーが記録される.
同じ操作を,開発環境の XP で実行してもエラーにはならない.
また,デバッグ版 exe も問題ない.
他にもいろいろやったが,省略.
WinXP で,ドキュメントをドロップして終了でエラーが発生.
結局,原因は VC 6 でのビルド時の依存関係と思われるが,リビルドで解決.
この exe ではあまり意味はないが,Profile::SetPathINI() を利用しているので,これが原因かと思った.
BOOL Profile::SetPathINI (void)
{
CWinApp* app = AfxGetApp() ;
if (app == NULL) { return FALSE ; }
CString nowINI = app->m_pszProfileName ;
if (nowINI.Find(_T(“\\”)) > 0) {
nowINI = GetFileName(nowINI) ;
}
CString newINI = Profile::CheckAndChangeINI(nowINI) ;
free((void*)app->m_pszProfileName) ;
app->m_pszProfileName = _tcsdup(newINI) ;
return TRUE ;
}
CWinApp::m_pszProfileName
HBITMAP から画像サイズ取得
昨日,クリップボードからの取得で画像サイズを求める方法がわからなかった.
HBITMAP hbm = (HBITMAP)::GetClipboardData(CF_BITMAP) ; if (hbm != NULL) { CSize bmpSize(10,10) ; { BITMAP bm ; ::ZeroMemory(&bm,sizeof(BITMAP)) ; if (::GetObject(hbm, sizeof(BITMAP),&bm)!=0) { bmpSize.cx = bm.bmWidth ; bmpSize.cy = bm.bmHeight; } } ... }
CBitmap で保持している場合は,
CBitmap bitmap ; if (bitmap.LoadBitmap(bmp_ID)) { BITMAP bm ; bitmap.GetBitmap(&bm) ; CRect rect = CRect(0,0,bm.bmWidth,bm.bmHeight) ; ... }
HENHMETAFILE では,
HENHMETAFILE hemf = (HENHMETAFILE)::GetClipboardData(CF_ENHMETAFILE) ; if (hemf !=NULL) { ENHMETAHEADER emh ; ZeroMemory(&emh,sizeof(ENHMETAHEADER)) ; emh.nSize = sizeof(ENHMETAHEADER) ; if (::GetEnhMetaFileHeader(hemf,sizeof(emh),&emh) != 0) { CRect rectB ; rectB.top = emh.rclBounds.top ; rectB.left = emh.rclBounds.left ; rectB.right = emh.rclBounds.right ; rectB.bottom= emh.rclBounds.bottom ; CRect rectF ; rectF.top = emh.rclFrame .top ; rectF.left = emh.rclFrame .left ; rectF.right = emh.rclFrame .right ; rectF.bottom= emh.rclFrame .bottom ; } }