2007年12月19日水曜日

C++2005 大文字混在文字列のバイト数を求める方法

文字数を求めたいのなら、以下に示すように簡単です。
int len = timedate->Length;

しかし、バイト数を求めるメソッドがありません。

以下の例では、test.txt に文字列を書込む処理ですが、
Write()の第1引数は、arrayなので、大文字・小文字が混在した文字列の場合、
文字数=バイト数とはならないので書込文字数が少なくなるときがあるため、バイト数を求める必要があるのです。


FileStream textfile( test.txt , FileMode::Append); // 追記モードでファイルを開く

System::String^ moji = "私(A)は何バイトだと思います?";

char pbuf[1024];
sprintf_s( pbuf , sizeof(pbuf) , "%s" , moji ); // char型変換

array ^ar = gcnew array(1024);
pin_ptr str = &ar[0];

System::Text::Encoding ^sjisEnc = System::Text::Encoding::GetEncoding("Shift_JIS");
int len = sjisEnc->GetByteCount( moji ); // バイト数取得

for(int ii=0 ; ii<len ; ii++ ){
str[ii] = pbuf[ii];
}
textfile.Write( ar , 0 , len ); // ファイルに書込み

2007年12月8日土曜日

DirectX SDK November 2007 の注意事項

DirectX SDK November 2007 には
dmusic.h が入っていません。
dmusic.h を使用したいときは、
DirectX SDK August 2007
を使用する必要があります。

詳しくは、以下を参照してください。
http://www.microsoft.com/japan/msdn/directx/Releasenotes/dxreadmeAug07J.aspx

2007年12月3日月曜日

Webアプリケーション新規作成のエラー対処

ASP.NET Webアプリケーションを新規作成しようとすると、以下のエラーが出現するときがあります。

"指定されたWebサーバーでASP.NET Version 1.1が実行されていません。ASP.NET Webアプリケーションまたはサービスを実行することはできなくなります。"

対処法は以下の通り。

1)コマンドプロンプト画面に以下のフォルダにある "aspnet_regiis.exe"をドラッグ&ドロップする。
C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\aspnet_regiis.exe

2)インストールオプション /i を入力してリターンを押す。
C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\aspnet_regiis.exe /i

すると、以下の文章が表示します。

ASP.NET(1.1.4322.0)のインストールを開始します。
ASP.NET(1.1.4322.0)のインストールが完了しました。

2007年10月24日水曜日

WindowsXP HOME EditionではWPF環境をインストールできない

WindowsXP HOME EditionでWPF環境をインストールできるものとできないものがあります。
以下に詳細を示します。

(可能)Visual C# 2005 Express Edition 日本語版
http://www.microsoft.com/japan/msdn/vstudio/express/vcsharp/

(可能)Microsoft .NET Framework 3.0 再頒布可能パッケージ
http://www.microsoft.com/downloads/details.aspx?displaylang=ja&FamilyID=10CC340B-F857-4A14-83F5-25634C3BF043

(可能)Microsoft® Visual Studio® 2005 Express Editions Service Pack 1
http://www.microsoft.com/downloads/details.aspx?familyid=7B0B0339-613A-46E6-AB4D-080D4D4A8C4E&displaylang=ja

(可能)Microsoft® Windows® Software Development Kit for Windows Vista™ and .NET Framework 3.0 Runtime Components
http://www.microsoft.com/downloads/details.aspx?FamilyID=c2b1e300-f358-4523-b479-f53d234cdccf&DisplayLang=en

(不可能)Visual Studio 2005 extensions for .NET Framework 3.0 (WCF & WPF), November 2006 CTP
http://www.microsoft.com/downloads/details.aspx?FamilyID=f54f5537-cc86-4bf5-ae44-f5a1e805680d&DisplayLang=en

※WindowXP Professional Edition ならインストールできます。

2007年10月17日水曜日

Platform SDK で Orcaインストール

Platform SDK で Orcaインストール

以下を実行します。
C:\Program Files\Microsoft Platform SDK\Bin\Orca.msi

これは統合作業の一部です。

VC++2005 新規プロジェクトで「Win32プロジェクト」を追加する方法

VC++2005 新規プロジェクトで「Win32プロジェクト」を追加する方法

1)C:\Program Files\Microsoft Visual Studio 8\VC\Express\VCProjects にある、Win32Console.vsz をコピーして、Win32Wiz.vsz に変更する。
2)テキストエディタでファイルを開き、以下 の2行を行ごと削除する。
Param="CONSOLE_TYPE_ONLY = true"
Param="WIZARD_ID = 75"
3)好きなアイコンを同じフォルダに Win32Wiz.ico という名前で用意する。

詳細は、以下を参照してください。
http://blogs.wankuma.com/tocchann/archive/2006/05/18/25272.aspx

2007年10月15日月曜日

MFC VC++ CString に char* をセットする方法

MFC VC++ CString に char* をセットする方法

char buf[] = "あいうえお";

CString strText(buf);

2007年10月3日水曜日

C++ const メンバ変数の記述方法

CからC++にコンバートするとき、以下のような constデータをメンバ変数として宣言する場合ですが、
そのまま宣言するとエラーとなります。

const unsigned char Bitdata[] = { 0x08 , 0x04 , 0x02 , 0x01 };

C++では、初期値を持つメンバ変数を宣言するとき、以下のようにすればOKです。

//----------------------------------------------------
class CDes
{
public:
const static unsigned char Bitdata[4];
}

const unsigned char CDes::Bitdata[] = { 0x08 , 0x04 , 0x02 , 0x01 };
//----------------------------------------------------

C++2005 では .Cのファイル がコンパイルできない!

C++2003 Professonal Edition は、.Cのファイルをコンパイルすることができたのですが、
C++2005 では、C++ファイルしかコンパイルできません。
これは、C++2005 が Express Edition だから制限がかかっているのかもしれません。
残念です。

2007年9月25日火曜日

文字列ポインタ

文字列ポインタについてまとめました。

いろいろありますが、●を使用しておけば無難だと思います。

 LPSTR char型ポインタ。
 LPCSTR    const char型ポインタ
 LPWSTR    wchar型ポインタ
 LPCWSTR    const wchar型ポインタ
●LPTSTR    TCHAR型ポインタ LPSTR/LPWSTRに置換えられる
●LPCTSTR const TCHAR型ポインタ LPCSTR/LPCWSTRに置換えられる

2007年9月21日金曜日

C++2005 テキストボックス char型文字 変換方法

テキストボックスから、文字を取得するには、sprintf() が一番簡単です。

■テキストボックスからchar型に変換して文字を取得する)
--------------------------------------
#include <stdio.h>

char buf[256];
sprintf_s( (char*)buf , sizeof(abuf) , "%s" , textBox1->Text::get() );
--------------------------------------
テキストボックスの文字数が、bufより多いとエラーが発生しますので、
textBox1->TextLength::get() で対策するのがいいでしょう。

(余談)以下のような方法もありますが、
[共通言語ランタイム サポート、古い構文 (/clr:oldSyntax)]
に設定変更する必要があるため個人的にはおすすめできません。
1)Marshal::StringToHGlobalAnsi(str)
2)PtrToStringChars(str)

2007年9月20日木曜日

C++2005 char型文字 テキストボックス 表示方法

ずっとずっと悩んでましたが、やっと解決しました。

次のソースは、char型の文字「$」を System::String型に変換してテキストボックスに入力します。

■解決したソース(テキストボックスへchar型文字を入力する)
--------------------------------------
char buf[2] = "$";
textBox1->Text += System::Runtime::InteropServices::Marshal::PtrToStringAnsi((IntPtr)buf);
--------------------------------------

これで、CreateFile()を使用したシリアルポート受信がテキストボックスで確認できます!

2007年9月11日火曜日

VC++2005 で CreateFile 問題解決

VC++2005 で シリアルポートがやっと使えるようになりました。

VC++6.0 で動いていたソースですが、 VC++2005 上でコンパイルすると、CreateFile でエラーが発生します。

[ソース]
Shandle = CreateFile( "COM1" , GENERIC_READ | GENERIC_WRITE , 0 , NULL , OPEN_EXISTING , FILE_ATTRIBUTE_NORMAL , NULL );

[エラー]
error C2664: 'CreateFileW' : 1 番目の引数を 'char [256]' から 'LPCWSTR' に変換できません。

そこで、エラーがでないようにキャストするとエラーは無くなります。

[ソース]
Shandle = CreateFile( (LPCWSTR)"COM1" , GENERIC_READ | GENERIC_WRITE , 0 , NULL , OPEN_EXISTING , FILE_ATTRIBUTE_NORMAL , NULL );

しかし、ハンドルが取得できませんでした。

■解決方法
VC++2005 で CreateFile と記述すると、CreateFileW になってしまうため、"COM1"などのシリアルポートのハンドルが取得できなくなると思います。
そこで、 CreateFileA を使用します。

[ソース]
Shandle = CreateFile( "COM1" , GENERIC_READ | GENERIC_WRITE , 0 , NULL , OPEN_EXISTING , FILE_ATTRIBUTE_NORMAL , NULL );

これで、ハンドルが正常に取得できるようになりました。

2007年9月8日土曜日

error LNK2019: がやっと解決しました!

以下のエラーが解決せずに、二週間も悩んでいましたが、今日やっと解決しました。

----------------------------------------
error LNK2019: 未解決の外部シンボル __imp__DispatchMessageA@4 が関数 _WinMain@16 で参照されました。
----------------------------------------

Win32 テンプレートが使えなかったのが原因のようです。


■解決方法:以下の手順4と5を実施するとOKです。
http://www.microsoft.com/japan/msdn/vstudio/express/visualc/usingpsdk/

2007年9月1日土曜日

.NET SerialPort の IsOpen() の戻り値がおかしいときがある

.NET SerialPort の IsOpen()メソッドですが、
シリアルポートがすでにオープンしているかどうかを
調べるために使用すると思うのですが、
ちゃんと検出してくれないときがあります。

例えば、COM1 を別のアプリケーションで使用(オープン)しているときに、
IsOpen()を使用すると、false(クロース状態)で返します。


-- 別のアプリケーションで COM1オープン中 --
if( serialPort1->IsOpen::get() == false ){ // ここでは false が返る
serialPort1->Open();
}


よって、続けて Open()メソッドを実行すると以下のエラーが出ます。

----------------------------------------------------------------
'System.UnauthorizedAccessException' のハンドルされていない例外が System.dll で発生しました。
追加情報: ポート 'COM1' へのアクセスが拒否されました。
----------------------------------------------------------------


ところが、COM1がクローズされている状態で Open()メソッドを実行し、
IsOpen()で状態を見ると、ちゃんと true(オープン状態)で返してくれます。


-- COM1クローズ中 --
serialPort1->Open();
if( serialPort1->IsOpen::get() == false ){ // ここでは true が返る
serialPort1->Open();
}


解決方法がわからないので、.NET SerialPort 今は使用しないことにします。
シリアル通信は、CreateFile() を使用しようと思います。

2007年8月31日金曜日

VC++2005 sprintf の代わりに Format を使う

VC++2005 sprintf の代わりに Format を使う

sprintf を使うとバイナリを簡単にアスキーコードに変換できるので便利でしたが、MFC では CString の Format がもっと便利でした。
VC++2005 では CString のかわりに、 String を使用しました。
String は型指定方法が "%02x" -> "{0:X02}" になったことや、変換値を Format の戻り値から取得するしかないなど使いにくく感じます。

でも、VC++2005 で MFC は使いたくないのでしょうがないですね。

例では、0x35 というデータを表示用としてアスキーコード 0x33,0x35,0x00(null) に変換します。
----------------------------------------
例)sprintf を使用した場合
----------------------------------------
char moji[3] = { null };
unsigned char bindata = 0x35;
sprintf(moji,"%02x",bindata);
----------------------------------------
例)CString の Format を使用した場合(MFC)
----------------------------------------
CString moji;
unsigned char bindata = 0x35;
moji.Format("%02x",bindata);
----------------------------------------
例)String の Format を使用した場合
----------------------------------------
String^ job;
unsigned char bindata = 0x35;
String^ moji = job->Format("{0:X02}" , bindata);

2007年8月30日木曜日

VC++2005 で シリアル通信を行う

前回 CreateFile() のエラーのため、別の方法でシリアル通信を行うことにしました。
ツールボックスにある”serialPort”を行うことにしました。

いろいろ試行錯誤してやっとテキストボックスに受信データを表示できるようになりました。

//-------------------------------------------------------------------
//■シリアルポート受信スレッド
private: System::Void serialPort1_DataReceived(System::Object^ sender, System::IO::Ports::SerialDataReceivedEventArgs^ e) {
unsigned char rcvData = serialPort1->ReadByte();
System::String^ string1;
String^ moji = string1->Format("{0:X}" , rcvData);
SetText( moji );
}
//■デリゲート
delegate void SetTextCallback(String^ text);
//■テキストボックスセット
private: void SetText(String^ text){
if( this->textBox1->InvokeRequired ){
SetTextCallback^ d = gcnew SetTextCallback(this, &t070824::Form1::SetText);
this->BeginInvoke( d, text );
}
else{
this->textBox1->Text += text;
}
}
//-------------------------------------------------------------------

2007年8月29日水曜日

VC++2005 と windows.h (続き)

VC++2005 で windows.h をインクリュードできるようになりました。

以下のURLの通りにすればOKです。
http://www.microsoft.com/japan/msdn/vstudio/express/visualc/usingpsdk/

でも、また問題が発生しました。

VC++6.0 で使っていたソースをコンパイルして実行すると、CreateFile() のところで次のエラーが発生します。

'System.NullReferenceException' のハンドルされていない例外が t070824.exe で発生しました。
追加情報: オブジェクト参照がオブジェクト インスタンスに設定されていません。

なかなか進みませんねぇ。

2007年8月28日火曜日

VC++2005 と windows.h

VC++2005 で windows.h をインクリュードすることができなかった。VC++6.0 やVC++2003であれば、windows.hをインクリュードできたのに。。。

2007年8月24日金曜日

Visual C++ 2005 Express Edition

今日、Visual C++ 2005 Express Edition をインストールしました。
以下より無償でダウンロードできます。
http://www.microsoft.com/japan/msdn/vstudio/express/visualc/

ユーザー登録が多少面倒ですが、無償なので助かります。

2007年8月22日水曜日

DirectX SDK

DirectX SDKをやっとインストールできた。インストールには結構時間かかった。

2007年8月16日木曜日

V850の内蔵DSPはどうやって使うのか?

NECのV850には、DSPが内蔵されているようですが、どうやって使用するのか知りません。まだ統合環境ツールをインストールしたばかりなので、DSPの使用方法を調べようと思います。