Google
 
Web itpro-blogger.blogspot.com
月曜日, 4月 30, 2007

[VC++]Win32API関連

▼質問
HINSTANCEの取得方法ってないの?

▼回答
Win32APIのGetModuleHandle関数を使えば取得できるよ。引数に0を指定すれば自プロセスが
取得できるんだ。

HINSTANCE hinstDLL;
hinstDLL = ::GetModuleHandle(0);


[C++]DLLパスの取得方法(VB取得方法)

・DLL側の記述方法

#include "TCHAR.H"

TCHAR szModuleFilePath[ _MAX_PATH + 1 ] = _T( "" );

BOOL APIENTRY DllMain(
HINSTANCE hinstDLL, // DLL モジュールのハンドル
DWORD fdwReason, // 関数を呼び出す理由
LPVOID lpvReserved // 予約済み
)
{
::GetModuleFileName( hinstDLL, szModuleFilePath, _MAX_PATH );

switch ( fdwReason )
{
case DLL_PROCESS_ATTACH: //DLLがロードされた時に呼び出される.
break;
case DLL_THREAD_ATTACH: //新たなスレッドを作成した時に呼び出される.
break;
case DLL_THREAD_DETACH: //作成されたスレッドが終了した時に呼び出される.
break;
case DLL_PROCESS_DETACH: //DLLがアンロードされた時に呼び出される.
break;
default:
break;
}
return TRUE;
UNREFERENCED_PARAMETER( hinstDLL );
UNREFERENCED_PARAMETER( lpvReserved );
}

SAMPLE_API char* APIENTRY getPath()
{
return (char*)szModuleFilePath;
}

SAMPLE_API void APIENTRY getVBAPath( OLECHAR* path )
{
char wModuleFilePath[sizeof( szModuleFilePath )];
memset( wModuleFilePath, 0x00, sizeof( wModuleFilePath ) );
strcpy( wModuleFilePath, getWchar_tToChar( szModuleFilePath ) );
SysFreeString( *path );
*path = SysAllocString( (OLECHAR*)wModuleFilePath );
}

・メモ
APIENTRYは、windef.hに「#define APIENTRY WINAPI」として定義されている。
#define SAMPLE_API extern "C" __declspec(dllexport)

・VB2005側の呼出し方法
Public Declare Auto Function getPath Lib "ファイル名.dll" () As System.Text.StringBuilder

Dim path As System.Text.StringBuilder = クラス名.getPath()
Dim getPath as String = path.ToString

・VBA側の呼出し方法
Public Declare Sub getVBAPath Lib "ファイル名.dll" (ByRef path As String)

Dim path As String
Call getVBAPath(path)


▼質問
関数毎にファイルを分けてプログラミングするとDLLのパスがうまく取得できない。どうすればいいの?

▼回答
下記のようにすれば取得できるよ。

TCHAR szModuleFilePath[ _MAX_PATH + 1 ] = _T( "" );
HINSTANCE hinstDLL = ::GetModuleHandle(TEXT("DLLファイル名.dll"));
::GetModuleFileName( hinstDLL, szModuleFilePath, _MAX_PATH );


日曜日, 4月 29, 2007

[C++]Hello World

■Hello World(標準出力)
・Java
public class Test {
public static void main(String[] args) {
System.out.println( "Hello, Java !!" );
}
}

・C++
#include
using namespace std;
int main()
{
cout << "Hello, C++ !!" << endl;
}

・C言語
#include
main()
{
printf("Hello World\n");
}


[C++]変数・定数

▼質問
enum E_ERROR { ERR_00 = 0, ERR_01 = -1, ERR_02= -2, ERR_03 = -3 };
を「E_ERROR::ERR_00」のように使用すると下記の警告が出る。
「警告 1 warning C4482: 非標準の拡張機能が使用されています: enum 'E_ERROR' が限定名で使用されます c:\パス\ファイル名.cpp 行番号 」

▼回答
「E_ERROR::」を外すと問題ない?下記の様にして呼べば良さそうである。

・定義の記述
namespace NS_DEF
{
enum { ERR_00 = 0, ERR_01 = -1, ERR_02= -2, ERR_03 = -3 };
}

・呼び方
NS_DEF::ERR_00

・参考
namespace NS_DEF
{
#define NUM 100 // NS_DEF::NUMにはならない。
}
マクロ定義は名前空間に含めることができない。

■参考サイト
●C++編(言語解説) 第18章 名前空間
http://www.geocities.jp/ky_webid/cpp/language/018.html

定数の定義にはconstを使う方が優れている。理由は、 #defineによる定数定義と違い、
constの場合はデータ型がはっきりしているからだそうだ。

■参考サイト
C++ reference
http://www.asahi-net.or.jp/~wv7y-kmr/memo/old/cpp_bas.html


[VC++]ビルドエラー

▼質問
リビルドすると下記のエラーが出る。
「エラー 1 error PRJ0050: 出力の登録に失敗しました。レジストリを変更するための適切なアクセス許可があるかどうかを確認してください。 ○○○」

▼回答
同じ名前でレジストリに登録されておかしくなったみたい?別名で作成したらうまくいった。

こんな方法よりプロジェクトのプロパティの設定を直した方が良さそうである。
プロジェクトの「構成プロパティ」→「リンカ」→「全般」→「出力の登録」を「いいえ」にする。

ATLプロジェクトの「出力の登録」について
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=100332


土曜日, 4月 28, 2007

[VB2005]VB.NETからの変更点メモ

▼質問
VB.NETで指定していたウィンドウハンドルのMe.hWndがエラーになるんだ。
候補リストからそれらしき名前のものを探しても見つからないんだ。どうして?

▼回答
どうしてか判らないが、Me.Handleを指定すればいいんだ。


[C++]VBA・VB2005への型変換

[Wtypes.hに含まれるアンマネージ型]:[アンマネージC言語型]:[マネージクラス名]:[説明][HANDLE]:[void*]:[System.IntPtr]:[32ビット]

[BYTE]:[unsigned]:[char]:[System.Byte]:[8ビット]

[SHORT]:[short]:[System.Int16]:[16ビット]

[WORD]:[unsigned]:[short]:[System.UInt16]:[16ビット]

[INT]:[int]:[System.Int32]:[32ビット]

[UINT]:[unsigned]:[int]:[System.UInt32]:[32ビット]

[LONG]:[long]:[System.Int32]:[32ビット]

[BOOL]:[long]:[System.Int32]:[32ビット]

[DWORD]:[unsigned]:[long]:[System.UInt32]:[32ビット]

[ULONG]:[unsigned]:[long]:[System.UInt32]:[32ビット]

[CHAR]:[char]:[System.Char]:[ANSIにより装飾]

[LPSTR]:[char*]:[System.StringまたはSystem.StringBuilder]:[ANSIにより装飾]

[LPCSTR]:[Const]:[char*]:[System.StringまたはSystem.StringBuilder]:[ANSIにより装飾]

[LPWSTR]:[wchar_t*]:[System.StringまたはSystem.StringBuilder]:[Unicodeにより装飾]

[LPCWSTR]:[Const]:[wchar_t*]:[System.StringまたはSystem.StringBuilder]:[Unicodeにより装飾]

[FLOAT]:[Float]:[System.Single]:[32ビット]

[DOUBLE]:[Double]:[System.Double]:[64ビット]


[クラス名]:[説明]:[Visual Basic のデータ型]:[C# のデータ型]:[C++ マネージ拡張のデータ型]:[JScript のデータ型]
●整数
[Byte]:[8ビット符号なし整数]:[Byte]:[byte]:[char]:[Byte]

[SByte]:[8ビット符号付き整数(非CLS準拠)]:[SByte(非組み込み型)]:[sbyte]:[signed char]:[SByte]

[Int16]:[16ビット符号付き整数]:[Short]:[short]:[short]:[short][Int32]:[32ビット符号付き整数]:[Integer]:[int]:[intまたはlong]:[int]

[Int64]:[64ビット符号付き整数]:[Long]:[long]:[__int64]:[long]

[UInt16]:[16ビット符号なし整数(非CLS準拠)]:[UInt16(非組み込み型)]:[ushort]:[unsigned short]:[UInt16]

[UInt32]:[32ビット符号なし整数(非CLS準拠)]:[UInt32(非組み込み型)]:[uint]:[unsigned intまたはunsigned long]:[UInt32]

[UInt64]:[64 ビット符号なし整数(非CLS準拠)]:[UInt64(非組み込み型)]:[ulong]:[unsigned __int64]:[UInt64]

●浮動小数点数
[Single]:[単精度 (32 ビット) 浮動小数点数]:[Single]:[float]:[float]:[float]
[Double]:[倍精度 (64 ビット) 浮動小数点数]:[Double]:[double]:[double]:[double]

●論理型
[Boolean]:[ブール値 (true または false)]:[Boolean]:[bool]:[bool]:[bool]

●その他
[Char]:[Unicode (16 ビット) 文字]:[Char]:[char]:[wchar_t]:[char]

[Decimal]:[96ビット10進値]:[Decimal]:[decimal]:[Decimal]:[Decimal]

[IntPtr]:[基になるプラットフォームによってサイズが決まる符号付き整数 (32 ビットのプラットフォームでは 32 ビット値、64 ビットのプラットフォームでは 64 ビット値) ]:[IntPtr(非組み込み型)]:[IntPtr(非組み込み型)]:[IntPtr(非組み込み型)]:[IntPtr]

[UIntPtr]:[基になるプラットフォームによってサイズが決まる符号なし整数 (32 ビットのプラットフォームでは 32 ビット値、64 ビットのプラットフォームでは 64 ビット値)(非CLS準拠)]:[UIntPtr(非組み込み型)]:[UIntPtr(非組み込み型)]:[UIntPtr(非組み込み型)]:[UIntPtr]

●クラス オブジェクト
[Object]:[オブジェクト階層構造のルート]:[Object]:[object]:[Object*]:[Object]
[String]:[Unicode 文字の不変固定長文字列]:[String]:[string]:[String*]:[String]


[整数型のサイズ]:[Visual Basic 6.0 の型と識別子の型文字]:[Visual Basic 2005 の型と識別子の型文字]:[共通言語ランタイム (CLR) の型]

[8ビット、符号付き]:[(なし)]:[SByte (なし)]:[System.SByte]

[8ビット、符号なし]:[Byte (なし)]:[Byte (なし)]:[System.Byte]

[16ビット、符号付き]:[Integer (%)]:[Short (なし)]:[System.Int16]

[16ビット、符号なし]:[(なし)]:[UShort (なし)]:[System.UInt16]

[32ビット、符号付き]:[Long (&)]:[Integer (%)]:[System.Int32]

[32ビット、符号なし]:[(なし)]:[UInteger (なし)]:[System.UInt32]

[64ビット、符号付き]:[(なし)]:[Long (&)]:[System.Int64]

[64ビット、符号なし]:[(なし)]:[ULong (なし)]:[System.UInt64]

32 ビット システムでは、32 ビット整数の演算の方が、16 ビットまたは 64 ビットの整数演算よりも高速です。つまり、Visual Basic 2005 では、Integer と UInteger は、効率の優れた基本的な数値型です。Visual Basic 2005 に移行するときに Long 宣言を Integer(Int32) に変更すると、アプリケーションのパフォーマンスを向上させることができます。

■参考サイト
プラットフォーム呼び出しによるデータのマーシャリング
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/cpguide/html/cpconmarshalingdatawithplatforminvoke.asp
.NET Framework クラス ライブラリの概要
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/cpguide/html/cpconthenetframeworkclasslibrary.asp


[VBA or VB2005]VBAとVBで同じ処理をしたいとき?

▼質問
VBAとVBで同じ処理をしたいときはどうしたらいいのだろう?

▼回答
VCでDLLを作成してWin32APIのように呼ぶしかないのかな?

このサイトに.NETでCOMとして作成してVBA側で参照設定をして使用できる方法もあると
書いてあるがどうなんだろう?

(このサイトはいろんな情報が充実していてすごい!すばらしい!!)
http://7ujm.net/VB/VBAVBnetActiveX.html

VB2005で試しにやってみたらCOMの登録でアセンブリの警告が出た!

作成方法
①プロジェクトの作成でクラスライブラリ(DLLの作成)を選ぶ。
②クラスファイルにコードを記述する。
③プロジェクトのプロパティから「コンパイル」を選択して「COM相互運用機能の登録(I)」を
チェックする。
④「スタート」→「全てのプログラム(P)」→「Microsoft Visual Studio 2005」→「Visual Studio Tools」
→「Visual Studio 2005 コマンド プロンプト」を起動してCOMの登録を行う。
C:\>regasm ○○○○○.dll /tlb /codebase
※解除方法:C:\>regasm ○○○○○.dll /unregister

ここで下記の問題?警告が発生!
「RegAsm : warning RA0000 : 署名されていないアセンブリを /codebase を使用して登録すると、同じコンピュータにインストールされるその他のアプリケーションとの競合が生じる可能性があります。/codebase スイッチは署名されたアセンブリのみに使用できます。アセンブリに厳密な名前を付けて、再登録してください。型は正常に登録されました。アセンブリは 'C:\○○○\○○○\○○○.tlb' にエクスポートされ、タイプ ライブラリは正常に登録されました。」

▼質問
アセンブリって何だ?

▼回答
署名のため機能らしい。

アセンブリを厳密名で署名するには?[VS 2005のみ]
http://www.atmarkit.co.jp/fdotnet/dotnettips/495strongname2005/strongname2005.html方法 : アセンブリに署名する (Visual Studio)
http://msdn2.microsoft.com/ja-jp/library/ms247123(VS.80).aspx

とりあえず実行してみたら下記のエラーが発生した。
「"ファイルまたはアセンブリ名 ○○○、またはその依存関係の 1 つが見つかりませんでした。"」

下記のサイトの手順で「<新規作成>」から適当なキー・ファイル「○○○_StrongName_Key」を
指定してパスワード無しでやったらうまく登録できたぞ!!ヤッター!!

アセンブリを厳密名で署名するには?[VS 2005のみ]
http://www.atmarkit.co.jp/fdotnet/dotnettips/495strongname2005/strongname2005.html

動かしてみたら今度はオートメーションエラーが発生!(;_;)...

パスが通っているところに移動して登録したら動いたが・・・。下記のエラーでうまくいかない。
「"ファイルまたはアセンブリ名 ○○○、またはその依存関係の 1 つが見つかりませんでした。"」

ここで、実験終了!この方法はとりあえず諦める事にしました。

Visual Basic 6.0 から Visual Basic .NET または Visual Basic 2005 アセンブリを呼び出す方法
http://support.microsoft.com/default.aspx?scid=kb;ja;817248

↑このサイトを読んでいたら通常のクラスとCOMクラスの作成方法に違いがあることが判明!

このサイトの説明文も一部間違っているが。。。。(重要なところ!)
9.[テンプレート] で [クラス] をクリックします。
→9.[テンプレート] で [COMクラス] をクリックします。

もう一度とトライしてみたがまたもエラーでした。でもエラーの内容が変わった。
「"ActiveX コンポーネントはオブジェクトを作成できません。"」



■参考サイト
プログラミング色々
http://7ujm.net/index.html
Microsoft Win32 と Microsoft .NET Framework API との対応
http://www.microsoft.com/japan/msdn/net/general/win32map.aspx
Visual Basic .NET How-To インデックス
http://www.microsoft.com/japan/msdn/howto/howtoVB.asp


金曜日, 4月 27, 2007

[VC++]メモ

▼質問
UNREFERENCED_PARAMETERって何?returnの後に記述している?何だ!

▼回答
UNREFERENCED_PARAMETERマクロらしい。引数として受け取った変数を1度も使用しなかった
ときにでるコンパイル時の警告を回避するためのものらしい。


土曜日, 4月 21, 2007

[VBA]Validation

「アプリケーション定義またはオブジェクト定義のエラーです。」のエラーがでる。
.Validation.Add Type:=Excel.XlDVType.xlValidateDecimal, AlertStyle:=Excel.XlDVAlertStyle.xlValidAlertStop, Operator:=Excel.XlFormatConditionOperator.xlGreater, Formula1:="-999999999"


xlValidateCustom:任意の数式を使用してデータを検証します。
xlValidateDate:日付値
xlValidateDecimal:数値
xlValidateInputOnly:値が変更された場合のみ検証を行います。
xlValidateList:指定したリストに値が存在する必要があります。
xlValidateTextLength:文字列の長さ
xlValidateTime:時間値
xlValidateWholeNumber:全数値


xlValidAlertInformation:情報アイコン
xlValidAlertStop:停止アイコン
xlValidAlertWarning:警告アイコン

▼回答
どこでもいいからselectしないと駄目みたい。うまくいくときもあるのはよくわからない?

http://www.keep-on.com/excelyou/2002lng4/200208/02080364.txt


土曜日, 4月 14, 2007

[VBA]

変数宣言の強制Option Explicit
配列インデックスの下限値を指定Option Base [01]
デフォルトは1
文字列比較の優先順位を指定Option Compare [TextBinary]
デフォルトはBinaryBinary A < B < E < Z < a < b < e < z
Text (A=a) < (B=b) < (E=e) < (Z=z)


金曜日, 4月 13, 2007

[VB.NET]CheckedListBox

Public Sub setCheckedListBoxSelected(ByRef oCListBox As CheckedListBox)
Dim value As Boolean = oCListBox.GetItemChecked(oCListBox.SelectedIndex) 'oCListBox.SetItemChecked(oCListBox.SelectedIndex, CBool(IIf(value.Equals(True), False, True))) oCListBox.SetItemCheckState(oCListBox.SelectedIndex, CType(IIf(value.Equals(True), CheckState.Unchecked, CheckState.Checked), System.Windows.Forms.CheckState)) If (oCListBox.SelectedIndex >= 0) Then oCListBox.SetSelected(oCListBox.SelectedIndex, False) oCListBox.Show()
End Sub


気になる記事

http://itpro.nikkeibp.co.jp/article/COLUMN/20070410/267878/?ST=biz_shinzui
バグの発生率を示す数式があるという話だった。開発工数や進捗の度合い、プログラムの本数などに基づき、ある数式で計算するとバグの発生率が算出でき、実際に発生するバグとの誤差は5%の範囲に収まるという。
プログラムの品質は、作成に時間がかかった部分があまり高くない


火曜日, 4月 10, 2007

[VB.NET]Option Strict OnとOffの比較(OO4O接続)

■OO4Oを使用したデータベース接続方法でOption StrictをOnにした時とOffにした時での
比較をしてみる。

Option StrictをOffにしたとき

Dim oraDb As OracleInProcServer.OraDatabase
Dim oraDynaset As OracleInProcServer.OraDynaset
Dim fieldValue as Integer

oraDynaset = oraDb.CreateDynaset("select * from table", 0&)
If oraDynaset.RecordCount > 0 Then
fieldValue = oraDynaset.Fields("FIELDNAME").Value
End If

Option StrictをONにすると次のようになる。

Dim oraDb As OracleInProcServer.OraDatabase
Dim oraDynaset As OracleInProcServer.OraDynaset
Dim fieldValue as Integer

oraDynaset = CType(oraDb.CreateDynaset("select * from table", 0&), OracleInProcServer.OraDynaset)
If oraDynaset.RecordCount > 0 Then
fieldValue = CInt(DirectCast(DirectCast(oraDynaset.Fields, OracleInProcServer.OraFields)("FIELDNAME"), _ OracleInProcServer.OraField).Value)
End If

比較してみるとOption StrictはOffにした方が良さそうである。(^^)v

■参考サイト
KEN's .NET [特集4] Option Strict Onのススメ
http://www5b.biglobe.ne.jp/~yone-ken/VBNET/special/sp04_OptionStrictOn.html


土曜日, 4月 07, 2007

[VB.NET]メモ

メンバ=定数=等価なキャラクタ文字:説明
CrLf=vbCrLf=Chr(13) + Chr(10):キャリッジ リターン文字とライン フィード文字の組み合わせ。
Cr=vbCr=Chr(13):キャリッジ リターン文字。
Lf=vbLf=Chr(10):ライン フィード文字。
NewLine=vbNewLine=Chr(13) + Chr(10):改行文字。
Tab=vbTab=Chr(9):タブ文字。

Option Strict Onの時、以下の項目が禁止され、ビルド時にエラーになる。
・明示的なキャスト演算子を使用しない縮小変換
・遅延バインディング
・Object 型での=、<>、TypeOf~Is~、およびIs以外の演算
・宣言でのAs句の省略

■関連サイト
http://www.atmarkit.co.jp/fdotnet/vb6tonet2/vbnet2_13/vbnet2_13_01.html


This page is powered by Blogger. Isn't yours?