ホーム » VC (ページ 12)
「VC」カテゴリーアーカイブ
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 ; } }
Clipboard Viewer
MSDN 2001.10 Creating a Clipboard Viewer Window
mk:@MSITStore:C:\Program%20Files\Microsoft%20Visual%20Studio\MSDN\2001OCT\1041\ipc.chm::/hh/winbase/clipbrd_19dj.htm
MSDN Using the Clipboard
BDH_Modify クラスを用意
BDH_Modify クラスを用意しました.
class BDH_Modify {
public:
BDH_Modify () { Modified = FALSE ; }
public:
virtual BOOL IsModified (void) const { return Modified ; }
virtual BOOL SetModifiedFlag (const BOOL mod=TRUE) { Modified = mod ; return TRUE ; }
virtual BOOL CanClose (void) { return SaveModified() ; }
public:
virtual CString GetPathName (void) const { return _T(“ファイル”) ; }
virtual BOOL DoFileSave (void) { return FALSE ; }
public:
virtual BOOL SaveModified (void) ;
protected:
BOOL Modified ;
} ;
inline
BOOL BDH_Modify::SaveModified (void)
{
if (!IsModified()) { return TRUE ; }
CString name = GetPathName() ;
if (name.Find(‘\\’) >= 0) {
name = ::GetFileName(name) ;
}
// VC98\MFC\SRC\DocCore.cpp CDocument::SaveModified() より
CString prompt ;
AfxFormatString1(prompt,AFX_IDP_ASK_TO_SAVE,name) ;
switch (AfxMessageBox(prompt,MB_YESNOCANCEL,AFX_IDP_ASK_TO_SAVE)) {
case IDCANCEL: return FALSE ; break ;
case IDYES : if (!DoFileSave()) { return FALSE ; } break ;
case IDNO : break ;
default : break ;
}
return TRUE ;
}
ダイアログベースなどで利用するために作成しました.
以下の様に利用しています.
#include “BDH_Mod.hxx”
class BDModCSV : public BDocCSV , public BDH_Modify {
public:
virtual BOOL Clear (void) { SetModifiedFlag(FALSE) ; return BDocCSV::Clear() ; }
public:
virtual void Serialize (CArchive& ar) { SetModifiedFlag(FALSE) ; BDocCSV::Serialize(ar) ; }
} ;
class Masters : public BDModCSV
{
// …
virtual CString GetPathName (void) const { return GetFilePath() ; }
virtual BOOL DoFileSave (void) { return FileWrite(GetFilePath()) ; }
} ;
BOOL Masters::AddMaster1 (Master* reg)
{
SetModifiedFlag(TRUE) ;
// …
}
void CEditCNDlg::OnCancel()
{
Masters* masters = Mast_S->GetSelected() ;
if (masters != NULL && !masters->CanClose()) { return ; }
CDialog::OnCancel();
}
VC6→VC8→MBCS→UNICODE C4651
c:\….\masteddg.cpp(4) : warning C4651: ‘/D_MBCS’ がプリコンパイル済みヘッダーに定義されていますが、現在のコンパイル処理には定義されていません。
vcproj 内の “;_AFXDLL;_MBCS;$(NoInherit)” を削除
VC 7 などで追加したファイルは,以下の様にシンプル.
<File
RelativePath=".\MastEdDg.cpp">
</File>
これは,VC 6 で追加したもの.
<File
RelativePath="MastS.cpp">
<FileConfiguration
Name="Debug|Win32">
<Tool
Name="VCCLCompilerTool"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS"
BasicRuntimeChecks="3"/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32">
<Tool
Name="VCCLCompilerTool"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"/>
</FileConfiguration>
</File>
2021/01
VC 12 LNK1104 , VC 14.2 LNK2019
コンパイル対象のソースをすべて選択して「プリプロセッサの定義」を
VC 2008 までは「ブランク」に.
VC 2010 以降は <親またはプロジェクトの既定値から継承> にする.
UNICODE と VC6 → VC8 一部修正
VC6 | UNICODE |
wWinMainCRTStartup
VC6 → VC8
http://cid-535f5973454c1292.skydrive.live.com/self.aspx/.Public/MFC/VC6%e2%86%92VC8.txt
「全般」-「出力ディレクトリ」,「中間ディレクトリ」 | .\$(ConfigurationName) |
「プリコンパイル済みヘッダファイル」 | $(IntDir)/$(TargetName).pch |
「C/C++」-「出力ファイル」 「ASMリスト...」 「オブジェクト...」 「プログラムデータベース...」 |
$(IntDir)/ |
「リンカ」-「全般」の「出力ファイル」 | $(OutDir)/$(ProjectName).exe |
リンカ」-「デバッグ」 「プログラムデータベースファイルの生成」 |
$(OutDir)/$(ProjectName).pdb |
「リソース」-「全般」の「リソースファイル名」 | $(IntDir)/$(InputName).res |
「MIDL」-「出力」の「タイプライブラリ」 | $(IntDir)/$(ProjectName).tlb |
「ブラウザ情報」-「全般」の「出力ファイル」 | $(OutDir)/$(ProjectName).bsc |
ビルドエラー fatal error C1060
VC 8 でのビルドでエラー
c:\program files\microsoft visual studio 8\vc\atlmfc\include\afxtempl.h(674) : fatal error C1060: ヒープの領域を使い果たしました。
c:\program files\microsoft visual studio 8\vc\atlmfc\include\afxtempl.h(675): クラス テンプレート のメンバ関数 ‘void CArray::AssertValid(void) const’ のコンパイル中
with
[
TYPE=Circle,
ARG_TYPE=Circle
]
\\dp340xpp\d_drive\develop\circary.hxx(79) : コンパイルされたクラスの テンプレート のインスタンス化 ‘CArray’ の参照を確認してください
with
[
TYPE=Circle,
ARG_TYPE=Circle
]
エラーメッセージの通り,不要な AP を終了することにより対応.
CHttpFile を利用した読込みで,…
CHttpFile を利用した読込みで,接続されていなくても ReadString でそれなりに戻ってくることがあった?
以下は,あるサイトが応答しているかどうかを確認するコードの断片.
#define W_M_P_C_ _T(“http://www.??????.com/”)
CString rData ;
if (!canConnectWeb && InetFile::Read(W_M_P_C_,rData)) {
if (rData.Find(K_M_P_C_) > 0) { canConnectWeb = TRUE ; }
connectdSite = W_M_P_C_ ;
}
アクセスする url に,ダブらないような情報を付加することで回避.
CString para = _T(“?_q_=”) + ::ToString(::GetTickCount()) ;
if (!canConnectWeb && InetFile::Read(W_M_P_C_+para,rData)) {
if (rData.Find(K_M_P_C_) > 0) { canConnectWeb = TRUE ; }
connectdSite = W_M_P_C_ ;
}
2022/09
CHttpFile Read
Dependency Walker , Spy , …
Dependency Walker
http://www.dependencywalker.com/
Spy++ 8.0 |
2005-09-28 10:07 140,463 spyxx.chm |
2005-12-01 03:24 496,824 spyxx.exe |
2005-09-23 02:13 73,728 spyxxhk.dll |
VC++ 2005 SP1 再頒布可能パッケージ |