MFC 追加でメモリリーク
MFC を利用しないコードを VC 6 でテストしていて,
コンソール AP として作成したスケルトンに,::oGetFileSize を追加.
MFC を利用した,::GetFileSize と動作を比べるために,
プロジェクトの設定を変更(共有 DLL で MFC を使用).
main 関数が存在するソースに Afx.h などの include を追加.
ビルドして実行すると,メモリリークが発生するようになった.
main 関数内を全てコメントにしてもあまり変わらない.
MFC サポートありで,コンソール AP を作成.
同様に oGetFileSize と GetFileSize を追加.
ビルド,実行すると特に問題ない.
StdAfx.h 内の Afx.h などを tmain のソース内に移動.
リビルドすると,メモリリーク発生.
どうも,Afx.h より前の iostream などが関係している.
また,リビルドしないと現象が変わらない.
StdAfx.h に iostream の include を追加
#define VC_EXTRALEAN
#include <iostream>
#include <afx.h>
Detected memory leaks! Dumping objects -> {51} normal block at 0x00032440, 33 bytes long. Data: < C > 00 43 00 CD CD CD CD CD CD CD CD CD CD CD CD CD {50} normal block at 0x00034F68, 40 bytes long. Data: < |L > 14 7C 4C 10 16 00 00 00 00 00 00 00 00 00 00 00 Object dump complete. スレッド 0x1218 終了、終了コード 0 (0x0)。 プログラム 'C:\...\T_Con2\Debug\T_Con2.exe' はコード 0 (0x0) で終了しました。
iostream のインクルードを afx.h より後にすることで対応.
open で errno = 13
ファイルにより,open で errno に 13 EACCES Permission denied が設定される.
bool Get_fstat (LPCTSTR name,struct stat* fs) {
if (fs == NULL) { return false ; }
int fh = _topen(name,O_RDONLY) ;
if (fh < 0) { i_Dump(errno) ; }
if (fh < 0) { return false ; }
memset(fs,0,sizeof(struct stat)) ;
int ret = fstat(fh,fs) ;
_close(fh) ;
return (ret == 0) ;
}
__FILE__ などは期待した動作だが,c:\pagefile.sys でエラーとなった.
VC 6 では,~\VC98\CRT\SRC\OPEN.C で CreateFile を呼出している.
その時の値は,
fileaccess 0x80000000
fileattrib 0x00000080
filecreate 0x00000003
fileshare 0x00000003
osfh 0x0013fef0
+ path 0x000326d1 “c:\pagefile.sys”
+ &SecurityAttributes 0x0013fdbc
circle.svg の Load で…
circle.svg の Load で,
‘System.Xml.XmlException’ の初回例外が System.Xml.dll で発生しました。
‘System.Xml.XmlException’ のハンドルされていない例外が System.Xml.dll で発生しました。
追加情報: セキュリティ上の理由から、DTD はこの XML ドキュメントでは使用できません。
DTD 処理を有効にするには、XmlReaderSettings の ProhibitDtd プロパティを False に設定し、XmlReader.Create メソッドにその設定を渡してください。
<?xml version=”1.0″ standalone=”no”? >
<!DOCTYPE svg PUBLIC “-//W3C//DTD SVG 1.1//EN” “http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd” >
<svg width=”320pt” height=”224pt” viewBox=”0 0 100 70″ xmlns=”http://www.w3.org/2000/svg” >
<circle cx=”30″ cy=”25″ r=”20″ fill=”orange”/>
<circle cx=”50″ cy=”35″ r=”20″ stroke-width=”4″ stroke=”brown” fill=”coral”/>
<circle cx=”70″ cy=”45″ r=”20″ stroke-width=”4″ stroke=”chocolate” fill=”none”/>
</svg>
これは,MSXML.dll を利用した場合も正しく読み込めていない(Xml_Import で対応).
Xml_Fnc.hxx の Xml_Import を MFC を利用しない様に書き直した時にもう一度考える.
現状の XmlI_MS や Xml_CLI は,DTD などが付加された xml には対応していない(Xml_Import では可能).
C4793 , C4279
Win 32 コンソール AP で MFC サポートのプロジェクトを作成.
/clr を有効にして,以下のコードで,
// L_xml_K.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 #include "StdAfx.h" #include "L_xml_K.h" #include "Xml_CLI.hxx" #include "XmlOut.hxx" #include "Xml_MS_.hxx" #undef GetTempPath #using <System.dll> #ifdef _DEBUG #define new DEBUG_NEW #endif // 唯一のアプリケーション オブジェクトです。 CWinApp theApp; using namespace std; int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { int nRetCode = 0; if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) { _tprintf(_T("致命的なエラー: MFC の初期化ができませんでした。\n")); nRetCode = 1; } else { System::String^ tmp = System::IO::Path::GetTempPath() ; System::String^ url = tmp + "211626.svg" ; tstring inXml = ::to_tstring(url) ; Xml_E xe_CLI = XmlI_CLI::Import(inXml.c_str()) ; Xml_E xe_MFC = XmlI_MS ::Import(inXml.c_str()) ; tstring outCLI = inXml + _T("_CLI.svg") ; tstring outMFC = inXml + _T("_MFC.svg") ; XmlOut::Export(xe_CLI,outCLI.c_str()) ; XmlOut::Export(xe_MFC,outMFC.c_str()) ; } return nRetCode; }
—— すべてのリビルド開始: プロジェクト: L_xml_K, 構成: Debug Win32 ——
プロジェクト ‘L_xml_K’、構成 ‘Debug|Win32’ の中間出力ファイルを削除しています。
コンパイルしています…
StdAfx.cpp
コンパイルしています…
L_xml_K.cpp
c:\…\CRT_MBWC.hxx(179) : warning C4793: ‘vararg’ : 関数 ‘BOOL StPrintF(LPTSTR,size_t,LPCTSTR,…)’ 用に
ネイティブ コードの生成が発生します
c:\…\CRT_MBWC.hxx(149) : ‘StPrintF’ の宣言を確認してください。
C:\…\Xml_MS_.hxx(14) : warning C4279: ‘value’: タイプ ライブラリ ‘msxml.dll’ の識別子はキーワードです。
’rename’ 修飾子を使用してください。
C:\…\Xml_MS_.hxx(14) : warning C4279: ‘value’: タイプ ライブラリ ‘msxml.dll’ の識別子はキーワードです。…
C:\…\Xml_MS_.hxx(14) : warning C4279: ‘value’: タイプ ライブラリ ‘msxml.dll’ の識別子はキーワードです。…
C:\…\Xml_MS_.hxx(14) : warning C4279: ‘value’: タイプ ライブラリ ‘msxml.dll’ の識別子はキーワードです。…
C:\…\Xml_MS_.hxx(14) : warning C4279: ‘value’: タイプ ライブラリ ‘msxml.dll’ の識別子はキーワードです。…
C:\…\Xml_MS_.hxx(14) : warning C4279: ‘value’: タイプ ライブラリ ‘msxml.dll’ の識別子はキーワードです。…
C:\…\Xml_MS_.hxx(14) : warning C4279: ‘value’: タイプ ライブラリ ‘msxml.dll’ の識別子はキーワードです。…
リソースをコンパイルしています…
リンクしています…
マニフェストを埋め込んでいます…
L_xml_K – エラー 0、警告 8
========== すべてリビルド: 1 正常終了、0 失敗、0 スキップ ==========
C4793 は,可変個引数リストの関数のため.
コンパイラの警告 (レベル 1 および 3) C4793
C4279 は検索すると,
having MSXML warnings
Why warning C4279 happens?
C4279 は,今回のプロジェクトのみの問題となると思われる.
MSXML.dll と,System.Xml.dll を同一プロジェクトでは利用しない様にするため.
今回は,それぞれで読込み,単純に書き込む動作のデバッグのためにプロジェクトを作成した.
C++ System::Xml::XmlReader
Visual C++ を使用して、ファイルから XML データを読み取る
Netting C++ XML による構成
XmlNode メンバ
XmlNode.Attributes プロパティ
XmlNode.ChildNodes プロパティ
System::Xml を利用した読込のコードを作成していて,テスト用のコードで
—— ビルド開始: プロジェクト: L_xml_I, 構成: Debug Win32 ——
コンパイルしています…
L_xml_I.cpp
.\L_xml_I.cpp(182) : error C2039: ‘GetTempPathW’ : ‘System::IO::Path’ のメンバではありません。
c:\windows\microsoft.net\framework\v2.0.50727\mscorlib.dll : ‘System::IO::Path’ の宣言を確認してください。
.\L_xml_I.cpp(182) : error C2660: ‘GetTempPathW’ : 関数に 0 個の引数を指定できません。
L_xml_I – エラー 2、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ==========
Windows.h をインクルードしてはいけない?
使用する前?に以下を追加.
#undef GetTempPath
2020/07 https://jml.mish.work/index.php/cpp/xml.html
2019/01 C++ と STL の範囲で書き直し
リンク先に msxml.dll などを使用しない C++ で書いたコードを置いています.
2019/08 System.Xml.dll と msxml.dll を使用したコードへのリンクを追加
xml_base.hxx
Str_CLI.hxx
Xml_CLI.hxx
Xml_MS_.hxx
Xml_In.hxx
tlbimp
今度は「COM 相互運用機能」ってやつ.
Tlbimp.exe を利用して,AsFile.tlb を ISFile.dll として出力.
SDK コマンドプロンプトを開き,~\ReleaseU のフォルダに移動.
tlbimp AsFile.tlb ISFile.dll
C# フォームアプリケーションを作成して,ボタンを配置.
参照の追加で,iSFile.dll を追加.
using iSFile; を追加.
private void button1_Click(object sender,EventArgs e) {
iSFile.SearchF srchF = new iSFile.SearchF() ;
string selFile = srchF.BrowseFile(“%Temp%\\”,””) ;
MessageBox.Show(selFile) ;
}
同様の動作の vbs での呼び出しは,
dim oFSch : set oFSch = CreateObject(“AsFile.SearchF”)
selFile = oFSch.BrowseFile(“%Temp%\”,””) ;
MsgBox x
以前聞いた時には,もっと面倒なイメージがあったがそれ程でもない.
ただ COM の部分が確定していない(平行してコードを書いている)時は面倒なのかも.
同様に AsHVR.exe をやってみたら,実行時エラー.
型 ‘AsHVR.AsHVRClass’ の COM オブジェクトをインターフェイス型 ‘AsHVR.IAsHVR’ にキャストできません。
IID ‘{1625D8E7-B67B-4592-878F-ECFAD1227734}’ が指定されたインターフェイスの COM コンポーネント上での QueryInterface 呼び出しのときに次のエラーが発生したため、この操作に失敗しました:
インターフェイスがサポートされていません (HRESULT からの例外: 0x80004002 (E_NOINTERFACE))。
これが面倒だったのかも?
他にも,T54W7U64 環境で,DevXP\~\CSCallL\bin\Debug\CSCallL.exe を起動して,「ボタン 1」 もエラーとなる.
これは,AsFile.dll の 64 ビット版がないことによるものと思うが,…
うまい方法がよくわからない.
2013/08/06
既存の AsHVR.exe などがうまく動作しないのは変わらないが,
VC 8 で新規に MFC ダイアログベースのプロジェクト TstComE を作成.オートメーションを有効に.
メソッド GetTmpPath を追加して実行するとうまくいった.
C++/CLI コンソール AP として作成.
// CPCallL.cpp : メイン プロジェクト ファイルです。
#include "stdafx.h"
using namespace System;
using namespace System::Windows::Forms;
int main(array<System::String ^> ^args)
{
{
iSFile::SearchF^ srchF = gcnew iSFile::SearchF();
// String^ selFile = srchF->BrowseFile("%Temp%\\","") ;
// MessageBox::Show(selFile) ;
}
{
AsHVR::AsHVR^ hmpvr = gcnew AsHVR::AsHVR();
// String^ key = hmpvr->GetKeySP();
// MessageBox::Show(key);
}
{
TstComE::TstComE^ tce = gcnew TstComE::TstComE() ;
String^ tmpFile = tce->GetTmpPath() ;
MessageBox::Show(tmpFile) ;
}
return 0;
}
今度は TstComE 以外うまく動作しない.
CLI MSDN のサンプルなど
連載! とことん VC++
第 8 回 C++/CLI を利用した相互運用 ~ネイティブ C++ から .NET の利用~
第 9 回 C++/CLI を利用した相互運用 ~.NET からのネイティブ C++ 資産の再利用~
VC++ 2010 Express などが対象となっている.
インストールなしで用意できた環境が VS 2008 だったが,特に問題なく進められた.
メニューの「プロジェクト」-「参照の追加」は,VC 2003 以降?
VC 2005 , VC 2008 では,ソリューションエクスプローラのプロジェクトの下に「参照設定」がない?
VC 2003 には存在するので.
VC 2002 では,プログラミング VisualC++.NET Vol.2 429 ページで
#using <..\Ex32a\Debug\Ex32a.dll> となっている.
さまざまな文字列型間で変換する
Visual C++ で System::String* から char* に変換する方法
System::String を wchar_t* または char* に変換する
BUG: The VC++ .NET or VC++ 2005 debugger cannot display std::string and std::wstring variables correctly
2013/08/05
C++/CLI を用いて、.NET 対応アプリケーションから MFC 対応クラスを使用する
慣れかもしれないが,ちょっと面倒に感じる.
Ubuntu で include
プラットフォームに依存しない C++ コードのコンパイルのテストなどを目的に,Ubuntu 環境に設定中…
MonoDevelop で,プロジェクトごと?のインクルードパスの設定は見つけた.
メニューの「プロジェクト」の一番下に「~のオプション」.
「ビルド」-「コード生成方法」-「パス」のタブ.
テストしたい(共通の)コードはネットワーク上にあるので,WinXP 上の Eclipse では,環境変数を利用していた.
DEVXP_SRC=\\DevXP\C_Drive\~\Develop\_.SRC
C_INCLUDE_PATH=%DEVXP_SRC%\__CPR_:~
CPLUS_INCLUDE_PATH=%C_INCLUDE_PATH%
Mac では(Xcode では),設定がよくわからず,main.cpp にフルパスで書いていた.
#include “/Volumes/C_Drive/~/_.SRC/Test/TestMem.cpp”
Linux ではマウントする必要があるみたいでここを参考にさせてもらって設定.
この時,sudo mount -t smbfs //devxp/c_drive /mnt/~ で
mount error: could not resolve address for devxp: Unknown error
sudo mount -t smbfs //192.168.0.10/c_drive ~ で通る様になった.
MonoDevelop で,/mnt/DevXP/C_Drive/~ を指定してコンパイルが通る様になった.
また,Eclipse でもメニューの「プロジェクト」-「プロパティ」,「C/C++ 一般」-「パスおよびシンボル」に設定がある.
環境変数としての設定はちょっとわからず.やったとこまで.
DEVXP_SRC=”/mnt/DevXP/C_Drive/Documents and Settings/~/_.SRC”
” または ‘ でくくる必要がある?
ls などの時は,ls “$DEVXP_SRC” (シングルクォーテーションではうまくないみたい).
2019/09/09
Linux から Windows 環境への接続
g++ インクルードパスの設定
この要求の処理に必要なリソースの解析中に…
プログラミング Visual C++.NET の Ex34a で,
‘/’ アプリケーションでサーバー エラーが発生しました。
パーサー エラー
説明: この要求の処理に必要なリソースの解析中にエラーが発生しました。以下の解析エラーの詳細を確認し、ソースファイルに変更を加えてください。
パーサー エラー メッセージ: 型 ‘Ex34a.ManagedCPPPage’ を読み込めませんでした。
ソース エラー:
|
ソース ファイル: /Test/ASP_net/Ex34a.aspx
行: 1
バージョン情報: Microsoft .NET Framework バージョン:2.0.50727.3649; ASP.NET バージョン:2.0.50727.3634
「インターネット インフォメーション サービス」を起動.
対象のフォルダ(ここでは Test/ASP_net )を選択して,「右クリック」-「プロパティ」.
「ディレクトリ」タブの真ん中あたり,「アプリケーションの設定」で「作成」する.
https://dev.mish.work/wordpress/2010/01/29/構成にエラーがあります/
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 + MFC
CLR コンソール アプリケーションを作成.
Console::WriteLine を追加.
#include “stdafx.h”
using namespace System;
int main(array ^args)
{
Console::WriteLine(L”Hello World”);
#ifdef _WIN32
Console::WriteLine(L”WIN32″);
#endif
#ifdef __cplusplus_cli
Console::WriteLine(L”CLI”);
#endif
#ifdef __CLR_VER
Console::WriteLine(__CLR_VER);
#endif
#ifdef _MFC_VER
Console::WriteLine(_MFC_VER);
#endif
return 0;
}
実行すると,
C:\…>”C:\…\debug\ConAp.exe”
Hello World
WIN32
CLI
20050727
これに MFC の機能を追加しようとしたがわからなかったので.MFC コンソール AP を作成して /clr を追加することにした.
#include “stdafx.h”
#include “ConMFC.h”
//
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
//
using namespace System;
// 唯一のアプリケーション オブジェクトです。
CWinApp theApp;
//
using namespace std;
//
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
//
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) {
_tprintf(_T(“致命的なエラー: MFC の初期化ができませんでした。\n”));
nRetCode = 1;
}
else {
// TODO: アプリケーションの動作を記述するコードをここに挿入してください。
}
Console::WriteLine(L”Hello World”);
#ifdef _WIN32
Console::WriteLine(L”WIN32″);
#endif
#ifdef __cplusplus_cli
Console::WriteLine(L”CLI”);
#endif
#ifdef __CLR_VER
Console::WriteLine(__CLR_VER);
#endif
#ifdef _MFC_VER
Console::WriteLine(_MFC_VER);
#endif
return nRetCode;
}
実行すると,
C:\…>”C:\…\debug\ConMFC.exe”
Hello World
WIN32
CLI
20050727
2048
CLR のバージョンは,2.0.50727
MFC は 0x0800
VC 定義済みマクロ
ASP.NET Web
Visual Studio .NET スタートブック を読みながら,ASP.NET Web サービスをテスト(使用した VS は 2005 ).
新規プロジェクトで出来上がった,Service1.asmx.vb の
<WebMethod()> Public Function HelloWOrld() … End Function の次に,以下を追加.
<WebMethod()> Public Function CalcSvc(ByVal x As Integer, ByVal y As Integer) As Integer
Return x + y
End Function
実行も本の通り.
同様に,Service1.asmx.cs では
[WebMethod]
public string HelloWorld() {
return “Hello World”;
}
[WebMethod]
public int CalcSvcCS(int x ,int y) {
return x + y ;
}
今度は C++ .
面倒だったので CalcCPPClass.h のみに.
[System::Web::Services::WebMethod]
String ^HelloWorld();
[System::Web::Services::WebMethod]
int CalcSvcCPP(int x,int y) { return x+y ; }
ソリューションに複数のプロジェクトとしていたので,どこかの設定が違うのか VS から直接の起動が出来ない.
ブラウザで //localhast/~/~.asmx を指定すれば期待した動作となる.
Mono
ここを参考にさせてもらって,MonoDevelop をインストール.
C# のコンソールプロジェクトで作成したスケルトンのまま,ビルド,実行はすんなり動作した.
先日作成したフォームを塗りつぶすコードも,プロジェクトをそのままコピーして実行できる.
private void Form1_Paint(object sender, PaintEventArgs e)
{
LinearGradientBrush brush = new LinearGradientBrush
(ClientRectangle,Color.Green,Color.White,LinearGradientMode.ForwardDiagonal);
e.Graphics.FillRectangle(brush,ClientRectangle);
}
VisualC#.NET プログラミング入門にある AssemblyViewer も起動はしている.
機能の動作はエラーとなることもあるが,これはこの exe などの制限かもしれない.
VS 2005 で生成できる C# のスクリーン セーバ スタート キットも実行できる.
/c で設定画面を表示して rss を指定しても,RSS の読込が正しく行われない?
→ と思ったが,やり直したら?正しく RSS が読めている.
mono SSaveCS.exe [/c]
VB.NET のプロジェクトは生成できるが,ビルドしようとするとコンパイラがないとのエラー.
検索して,vbnc をインストール.
コンソール AP は通る様になったが,Windows フォームではコンパイルエラー?
Application.Designer.vb
Me.MainForm = Global.WinApVB.FormVB
’WinApVB.FormVB’ is a type and cannot be use as an expression.(VBNC30691)
VB Windows フォームには対応していないのか?
OpenCV 環境作成
C++/CLI & OpenCV 画像処理 GUI プログラミング を購入したので,環境を作ってみた.
OpenCV 2.4.3 などは VC 9 , 10 が標準で用意されているので,VS 2008 をインストール.
VS のインストールに時間がかかるので,平行して Linux の環境にも作成してみたが,よくわからず.
第 1 章の C++/CLI での読込まで,特に問題なくできた.
第 2 章をやっていて,ビルドすると
—— ビルド開始: プロジェクト: 03Flip, 構成: Debug Win32 ——
コンパイルしています…
stdafx.cpp
コンパイルしています…
AssemblyInfo.cpp
03Flip.cpp
C:\…\include\opencv2/core/types_c.h(305) : error C3862:
‘cvRound’: /clr:pure または /clr:safe を伴うアンマネージ関数をコンパイルできません
インラインのネイティブ アセンブリはマネージ コードでサポートされていません
C:\…\include\opencv2/core/types_c.h(305) : error C3645:
‘cvRound’ : __clrcall は、ネイティブ コードにコンパイルされた関数では使用できません
コードを生成中…
ビルドログは “file://c:\…\Projects\T_OpenCV3Flip\Debug\BuildLog.htm” に保存されました。
03Flip – エラー 2、警告 0
/clr:pure から /clr に変更していなかった.
2013/07/18
第 5 章で,toolStripStatusLabel1 がわからなかった.
statusStrip1 を配置後,ステータスバー上のドロップダウンで,StatusLabel を追加する必要がある.
第 7 章のドラッグ&ドロップ対応で,
どこを間違えているのかわからないが,ボタンの Panel 部分にかぶって PictureBox が表示されている.
保存対応ではもう一度最初からやって,これは OK.
これらとは直接関係ないが,変な現象.サムネイルが合っていない.再起動しても改善せず.
2013/07/19
7 章のPictureBox がかぶるのは,どうも他のフォームからコピーした時に何かの情報が変わってしまうみたい.
Panel を削除して,もう一度 Panel と PictureBox を配置することにより意図した動作となった.
su でパスワードが…
su でパスワードが入らない.
そもそも,いつどこで設定したのか記憶がない.
sudo でのパスワードは通る.
検索すると,
[linux]Ubuntuは初期状態ではrootが使えない
Ubuntu Linuxのルートパスワード
フォームへの描画
フォームに,左上から右下へグラデーションで表示する動作を幾つかの言語で書いてみた.
C#
//…
using System.Drawing.Drawing2D;
//…
namespace WinApCS
{
public partial class FormCS : Form
{
public FormCS()
{
InitializeComponent();
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
LinearGradientBrush brush = new LinearGradientBrush
(ClientRectangle,Color.Green,Color.White,LinearGradientMode.ForwardDiagonal);
e.Graphics.FillRectangle(brush,ClientRectangle);
}
protected override void OnResize(System.EventArgs e)
{
Invalidate();
}
}
}
VB
Imports System.Drawing.Drawing2D
Public Class FormVB
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
Dim brush As New LinearGradientBrush
(ClientRectangle, Color.Blue, Color.White, LinearGradientMode.ForwardDiagonal)
e.Graphics.FillRectangle(brush, ClientRectangle)
End Sub
Protected Overrides Sub OnResize(ByVal e As System.EventArgs)
Invalidate()
End Sub
End Class
J#
//…
import System.Drawing.Drawing2D.*;
//…
public class FormJS extends System.Windows.Forms.Form
{
//…
private void Form1_Paint(Object sender, PaintEventArgs e)
{
LinearGradientBrush brush = new LinearGradientBrush
(get_ClientRectangle(),Color.get_Red(),Color.get_White(),LinearGradientMode.ForwardDiagonal) ;
e.get_Graphics().FillRectangle(brush,get_ClientRectangle()) ;
}
protected void OnResize(System.EventArgs e)
{
this.Invalidate();
}
}
C++/CLI
//…
namespace WFmCpClr {
//…
using namespace System::Drawing::Drawing2D;
//…
public ref class FormVC : public System::Windows::Forms::Form
{
//…
private: System::Void FormVC_Paint
(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) {
LinearGradientBrush^ brush = gcnew LinearGradientBrush
(ClientRectangle,Color::Olive,Color::White,LinearGradientMode::ForwardDiagonal) ;
e->Graphics->FillRectangle(brush,ClientRectangle) ;
}
private: System::Void FormVC_Resize(System::Object^ sender, System::EventArgs^ e) {
Invalidate();
}
};
}
error BC30451
ゼロから学ぶ!最新 Visual Basic をやっていて,
—— ビルド開始: プロジェクト: GetGMail, 構成: Debug Any CPU ——
C:\…\GetGMail\Form1.vb(29) : error BC30451: 名前 ‘HttpUtility’ は宣言されていません。
C:\…\GetGMail\Form1.vb(30) : error BC30451: 名前 ‘HttpUtility’ は宣言されていません。
C:\…\GetGMail\Form1.vb(112) : error BC30451: 名前 ‘HttpUtility’ は宣言されていません。
========== ビルド: 0 正常終了または最新の状態、1 失敗、0 スキップ ==========
検索すると,「参照の追加」で System.Web を追加する必要があるとのこと.
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 とすることで対応?
Eclipse での設定など
ndk-build でのエラー
Compile thumb : ~ <= ~.c が表示されない.
Android.mk の記述ミス.LOCAL_SRC_FILE になっていた(S がなかった).
TextView に setText などをするとエラーになる.
setContentView(R.layout.activity_main) が呼ばれていなかった(コメントになっていた).
cpp として作成したものの利用で実行時エラー
原因はわからず.c のファイルとして書換えてビルドで通った.
undefined reference to ‘sysinfo’
Using sysinfo in Android NDK を見つけたが,使い方がわからず.
undefined reference to ‘__NR_sysinfo’ となってしまう.
C/C++ プロジェクトのインクルードパスの設定
プロジェクトの「プロパティ」,「C/C++ ビルド」-「設定」-「ツール設定」-「GCC ~ Compiler」-「インクルード」.
全プロジェクトで有効にするには環境変数としての登録が必要?
NDK 環境作成 – 2
Eclipse と ADT で,Java を使用した Android AP は作成可能となった.
まだ NDK を入れてないので,プロジェクトの「右クリック」から「Android ツール」-「Add Native Support…」を選択すると,
Android NDK を展開し,そのパスを「ウィンドウ」-「設定」,「Android」-「NDK」にパスを設定.
これで,「Add Android Native Support」ダイアログの「完了」が押せる様になる.
コマンドプロンプトから ndk-build などを実行するために環境変数の Path を設定
%ANDROID_NDK% に c:\~\android-ndk-r8e
%Path% に %ANDROID_NDK% を追加.
Android NDK: WARNING: APP_PLATFORM android-14 is larger than android:minSdkVersion 8 in ./AndroidManifest.xml
よくわからないが,検索すると
APP_PLATFORM=android-8 と記述した Application.mk を jni の下に作成すると通る.