Win XP 100%
.NET と Win32 API
HDC の利用
IntPtr のまま与えてしまうと,
c:\…\Form1.h(156) : error C2664: ‘DrawText’ : 1 番目の引数を ‘System::IntPtr’ から ‘HDC’ に変換できません。
IntPtr pDC = e->Graphics->GetHdc() ;
HDC hDC = static_cast(pDC.ToPointer()) ;
// DrawText(hDC, tstr.c_str(), -1, &rect, 0 );
e->Graphics->ReleaseHdc(pDC) ;
ちょっと古いが,プログラミング Visual C++.NET Vol.2 P.459
コードを修正しビルドすると,
~.obj : error LNK2028: 未解決のトークン (0A00005B) …
~.obj : error LNK2019: 未解決の外部シンボル …
「親または…」にチェックを入れる.
C# のコードを C++.NET で…
MSDN にあるサンプルを VC++2008 でビルドする.
MSDN 四角形内にテキストを折り返して描画する
新規プロジェクトで「Windows フォーム アプリケーション」.
Paint のハンドラを追加.
private: System::Void Form1_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) {
/*
string text2 = “Draw text in a rectangle by passing a RectF to the DrawString method.”;
using (Font font2 = new Font(“Arial”, 12, FontStyle.Bold, GraphicsUnit.Point))
{
Rectangle rect2 = new Rectangle(30, 10, 100, 122);
// Specify the text is wrapped.
TextFormatFlags flags = TextFormatFlags.WordBreak;
TextRenderer.DrawText(e.Graphics, text2, font2, rect2, Color.Blue, flags);
e.Graphics.DrawRectangle(Pens.Black, Rectangle.Round(rect2));
}
*/
String^ text2 = “Draw text in a rectangle by passing a RectF to the DrawString method.”;
Drawing::Font^ font2 = gcnew Drawing::Font(“Arial”, 12, FontStyle::Bold, GraphicsUnit::Point) ;
Drawing::Rectangle^ rect2 = gcnew Drawing::Rectangle(30,10,100,122) ;
TextFormatFlags flags = TextFormatFlags::WordBreak ;
TextRenderer::DrawText(e->Graphics,text2,font2,*rect2,Color::Blue,flags) ;
e->Graphics->DrawRectangle(Pens::Black,*rect2) ;
}
RECT または CRect にあたるものは,Drawing::Rectangle .
ここで利用している Font は Drawing::Font としないとエラーになる.
c:\…\drawt_2\Form1.h(87) : error C2061: 構文エラー : 識別子 ‘Font’
DrawText などの Rectangle はハンドルではなく実体.
2013/11/05
C# の文字列の前の ‘@’
リテラル文字列
MFC での文字列の変数に対する += .
CString str ;
str += _T(“123”) ;
C++/CLI で System::String は可能であるが,C# の string ではエラーとなるみたい.
2013/11/06
C# で g.Dispose() ;
C++ では delete g ;
Graphics.Dispose メソッド
WR9500N 追加
PA-WR9500N-HP/E を購入.
8500 が動作したまま接続.IP アドレスがぶつかることは認識していたがそれなりに動作していた.
8500 を 212 に変更.
一部の機器を除いて PC 関係はほぼこれで問題なさそう.
子機の設置は後日.
Mac での,Wi-Fi の状態の確認.「option」+「Wi-Fi マーク」
2013/10/31 追記
子機を設置.接続したのは今の所 TV のみ.
子機の状態をブラウザで見ると,リンクアップ速度 216Mbps となっている.
今回の LAN 環境とは関係ないことではあるが,以前 Win7 のホストとその中のゲストでのファイル共有が遅かった.
ゲストの WinXP からホストのファイルへのアクセスが特に遅かったが,いつの間にか改善したみたい.
最近稼動している全 PC の設定が終わったので,8500 を外した.
残りはプリンタぐらい?
2013/12/29
DBR-T460 を追加.子機に接続.
ネットワーク上の別の TV から,レコーダーにとりためたものが見れる様になった.
2014/02/07 追記
いつだったか忘れた,うちの環境ではあまり関係ないが,
初代 PS3 (CECHB00)をいろいろいじっていると,T460 が見えた.
PS3 メディアサーバー接続
また,先日録画した BTTF を BD-RE に焼いて,PS3 で再生.
これらのことは,さすがと感じる.
Mavericks インストール
OS X Mavericks をインストール.
ダウンロード,再起動後のインストール時間は 44 分?の表示だったが,...
途中で見ると,2 時間 14 分とか,1 時間 36 分とか,...
1 分未満の表示になってから,しばらく変化がなかった.5 分位?
前回の Mountain Lion と同様 1 時間程度.
さらに再起動後 15 分程度.
VirtualBox を起動すると,
仮想マシン”WinXP-Dev”のセッションを開けませんでした。
Failed to open/create the internal network ‘HostInterfaceNetworking-en1’
(VERR_SUPDRV_COMPONENT_NOT_FOUND).
終了コード : NS_ERROR_FAILURE (0x80004005)
コンポーネント: Console
インターフェース: IConsole {db7ab4ca-2a3f-4183-9243-c1208da92392}
Mavericks と VirtualBox で検索すると,
VirtualBox を再インストールすれば良いとのこと.
ダウンロードフォルダにあった,VirtualBox-4.2.18-88780-OSX.dmp のインストールでうまくいった.
vdi をコピーしたいと思い,調べると VBoxManage clonehd が見つかった.
が,ちょっと面倒なのでさらに調べると,Virtual Box マネージャーにクローンがあった.
使ってみると,MAC アドレスがぶつかってしまってる.
ネットワークの設定で「高度」の中に,更新する機能があった.
2013/10/28 追記
OS のアップデート,AP の変更などいろいろあり,どれが原因か突き止められてないが,
ゲストと他の PC との接続などが安定してない.ホストとの接続もできない状態にもなった.
前回と同様に VirtualBox を再インストールすると意図した動作(他の PC が見える)にはなる.
それと,ちょっと別の困った現象.
マウス(Magic Mouse)の動作が安定しない?
ドロップダウンリストなどの時に意図しないものに切替ってしまう.
LAN-RPT01BK 追加
LAN-RPT01BK を追加.
設置場所が悪いのか,ちょっと不安定な気がする.
スマートフォンなので詳細がわからないが,どうも途切れることがある様な感じ.
導入前は場所によりつながらなかったので,それよりは良くなったと思われる.
その後,ノート PC での速度が遅くなったみたいで,結局外す事にした.
また,アクセスポイントの位置を 1m 程度ずらすことにより,いい感じにカバーできるようになった.
typedef … BOOL ;
iOS のプロジェクトでビルドすると,BOOL の定義(typedef int BOOL ;)で,
/…/i_Define.hxx:30:18: Typedef redefinition with different types (‘int’ vs ‘signed char’)
iPhoneSimulator6.1/usr/include/objc/objc.h に以下が定義されている.
typedef signed char BOOL;
以下の様に OBJC_BOOL_DEFINED で振り分け.
#ifdef OBJC_BOOL_DEFINED
#else
typedef int BOOL ;
#endif
他にも,Mac 64-bit でビルドすると,long のビット長の問題で幾つかワーニングになる.
いい対応方法が思いつかないので,ひとまず幾つかはそのままとする.
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);
}
sh でエラー
sh を作成して実行すると,
iwao@VB-Ubuntu:~/Documents$ sh mount_error.sh
mount_error.sh: 1: mount_error.sh: sudo: not found
以前作成したものと比較したが,Ubuntu 上では見分けがつかなかった.
Windows 環境にコピーして,MIFES で開くとそれぞれで文字コードが異なる.
エラーになる sh をバイナリで開くと,EF BB BF が付加されていた.
どうも Ubuntu 上で利用したツールで,保存時に UTF-8 BOM 付としてしまったみたい.
ostrstream の利用でメモリリーク
次の様なコードでメモリリーク.freeze(false) がなかったのが原因.
tstring To_tstring (const double v,const int w=0,const int p=6,const long f=0) {
tstring str ;
std::ostrstream strBuf ;
if (f != 0) {
strBuf.flags(f) ;
}
{
strBuf.width(w) ;
strBuf.precision(p) ;
}
{
strBuf << v ;
strBuf << std::ends ;
}
{
str = strBuf.str() ;
// strBuf.rdbuf()->freeze(false) ;
}
return str ;
}
Detected memory leaks!
Dumping objects ->
{385} normal block at 0x00038168, 512 bytes long.
Data: < 1.05 > 20 20 31 2E 30 35 00 CD CD CD CD CD CD CD CD CD
{363} normal block at 0x00037F20, 512 bytes long.
Data: <233.50 > 32 33 33 2E 35 30 00 CD CD CD CD CD CD CD CD CD
{339} normal block at 0x00037C70, 512 bytes long.
Data: < 967 > 20 20 20 39 36 37 00 CD CD CD CD CD CD CD CD CD
{315} normal block at 0x00037A28, 512 bytes long.
Data: < 875 > 20 20 20 38 37 35 00 CD CD CD CD CD CD CD CD CD
{291} normal block at 0x000377E0, 512 bytes long.
Data: < 997 > 20 20 20 39 39 37 00 CD CD CD CD CD CD CD CD CD
{269} normal block at 0x00037598, 512 bytes long.
Data: < 1.08 > 20 20 31 2E 30 38 00 CD CD CD CD CD CD CD CD CD
{245} normal block at 0x00037350, 512 bytes long.
Data: < 955 > 20 20 20 39 35 35 00 CD CD CD CD CD CD CD CD CD
{223} normal block at 0x00037108, 512 bytes long.
Data: < 1.15 > 20 20 31 2E 31 35 00 CD CD CD CD CD CD CD CD CD
{201} normal block at 0x00036EC0, 512 bytes long.
Data: < 1.02 > 20 20 31 2E 30 32 00 CD CD CD CD CD CD CD CD CD
{169} normal block at 0x000369B8, 512 bytes long.
Data: < 1.06 > 20 20 31 2E 30 36 00 CD CD CD CD CD CD CD CD CD
{143} normal block at 0x00036770, 512 bytes long.
Data: < 1003 > 20 20 31 30 30 33 00 CD CD CD CD CD CD CD CD CD
Object dump complete.
スレッド 0xDEC 終了、終了コード 0 (0x0)。
プログラム ‘C:\…\DmpFS\Debug\DmpFS.exe’ はコード 0 (0x0) で終了しました。
2013/08/26
上のコードを Xcode でビルドすると,strBuf.flags(f) の所で
/Volumes/…/t_string.hxx:47:10: No matching member function for call to ‘flags’
利用する前に fmtflags 型にして利用する様に変更.
std::ios_base::fmtflags f = std::ios_base::fmtflags(f_) ;
2013/08/28
_UNICODE に対応できなかったので,ostringstream を利用する様に変更.
tstring To_tstring (const double v,const int w=0,const int p=6,const unsigned f_=std::ios::fixed) {
tstring str ;
#ifdef _UNICODE
std::wostringstream strBuf ;
#else
std::ostringstream strBuf ;
#endif
std::ios_base::fmtflags f = std::ios_base::fmtflags(f_) ;
if (f != 0) { strBuf.flags(f) ; }
strBuf.width(w) ;
strBuf.precision(p) ;
strBuf << v ;
str = strBuf.str() ;
return str ;
}
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 対応クラスを使用する
慣れかもしれないが,ちょっと面倒に感じる.