テキスト広告:Amazon Primeday

日曜日, 6月 10, 2007

[ORACLE]プロシージャ

▼質問
クライアントからサーバの処理を実行したいんだけど・・・。プロシージャで、できないのかな?

▼回答
実行ファイルが処理できるDLL(Windows)かSO(Unix)を作成して外部プロシージャに
定義(ライブラリ登録?)すれば実現できるよ!

自作しなくてもWindowsAPIを呼ぶことができるからいろいろできそうである。

下記のサイトにINIファイルのAPIを呼ぶサンプルがあったので実験してみた。

いっしーのプログラムヒント集
http://www.j-real.com/stone/progtips.html#Ora2

コピペしたらうまくいかなかったのでうまくいったものを下記に示しておきます。
←こんなエラーが出た!「PLS-00103: 記号"SHOW"が見つかりました」

SQL*Plusに「SYSTE]でログインして実行する。

ここから-------------------------------------------------------------------------------->

-- DLLファイルの名称定義 ディレクトリは環境によって変えてください
create or replace library kernel32 is 'c:\windows\system32\kernel32.dll';
/
show errors;

-- APIのGetPrivateProfileIntA(Iniファイルから数値を取り出す)
create or replace function GetIniInt(
lpApplicationName CHAR,
lpKeyName CHAR,
nDefault BINARY_INTEGER,
lpFileName CHAR
) RETURN BINARY_INTEGER AS
EXTERNAL
LIBRARY kernel32 NAME "GetPrivateProfileIntA"
LANGUAGE C
CALLING STANDARD C;
/
show errors;

-- APIのGetPrivateProfileStringA(Iniファイルから文字列を取り出す)
create or replace function GetIniString( --この関数名は好きなものを付けられます
lpApplicationName String,
lpKeyName String,
lpDefault String,
lpReturnedString OUT String,
nSize BINARY_INTEGER,
lpFileName String
) RETURN BINARY_INTEGER AS
EXTERNAL
LIBRARY kernel32
NAME "GetPrivateProfileStringA"
LANGUAGE C
CALLING STANDARD C;
/
show errors;

<--------------------------------------------------------------------------------ここまで SQL*Plusの実行結果 SQL> @C:\Work\プロシージャ\CRE_SP_INI.sql
ライブラリが作成されました。
エラーはありません。
ファンクションが作成されました。
エラーはありません。
ファンクションが作成されました。
エラーはありません。
SQL>

プロシージャの作成
名前:SP_INI_TEST
ソース

ここから-------------------------------------------------------------------------------->

(
dat in out varchar2,
ret out int
) as
begin
ret := GetIniInt('intl','iCountry', 0, 'c:\windows\win.ini');
dbms_output.put_line(ret);
ret := GetIniString('intl','sCountry', 'Default', dat, 255, 'c:\windows\win.ini'); dbms_output.put_line(dat ' ' ret);
end;

<--------------------------------------------------------------------------------ここまで SQL*Plusの実行方法 SQL> variable dat varchar2(255)
SQL> variable ret NUMBER
SQL> execute SP_INI_TEST( :dat, :ret )

こんなエラーが出た!
「ORA-28595: Extprocエージェント : DLLパスが無効です」

Oracle Net Servicesの拡張機能の使用
http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/network.102/B19208-02/advcfg.htm

上記の「表 13-5 listener.oraファイルの外部プロシージャ設定」を読むとリスナーの設定が
必要のようだ。
「Net Manager」→「リスナー」→「LISTENER」→「その他のサービス」→「環境」

"EXTPROC_DLLS=ANY"
うまくいかん!

行番号 = 1 列番号 = 32 エラー・テキスト = PLS-00103: 記号"BEGIN"が見つかりました。 次のうちの1つが入るとき: ( ; is with authid as cluster compress order using compiled wrapped external deterministic parallel_enable pipelined

■参考サイト 外部プロシージャのコール http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/appdev.102/B19248-02/adfns_extern_proc.htm
OKLab - Oracle PL/SQL入門
http://www.oklab.org/oracle/plsql.xhtml

土曜日, 6月 09, 2007

[tool]Windowsでリモートシェル

▼質問
LAN(2重化)の2枚挿しの時にリモートシェルが片方しか実行されない。

▼回答
リモートシェルが起動する時、RSHSVC.EXEは接続されているIPアドレスを優先的に取得し、
2つのLANが正常に接続されている時は、ネットワークの詳細設定で設定されている優先順位
によって決まるようだ。

起動時につながっていたLANに障害が発生した時は、RSHSVC.EXEを再起動しなくては正常な
LANに繋げにいくことはできない。

自動でリモートシェルを切替えるには面倒なようだ。(>_<);

■rshコマンド http://www.microsoft.com/technet/prodtechnol/windowsserver2003/ja/library/ServerHelp/da116a07-36a0-4b8d-885e-eec3b8ed33fe.mspx?mfr=true

■サービス登録方法(SC.EXE)
sc Create RshSvc binPath= "C:\WINDOWS\system32\RSHSVC.EXE" start= auto DisplayName= "Remote Shell Service"

■参考サイト
Windows Services for UNIX
http://www.microsoft.com/japan/technet/interopmigration/unix/sfu/default.mspx
リモートコンソール関係1
http://www.netwave.or.jp/~jun-n/reskit/remote1.htm
Remote Shell Services in SFU
http://technet.microsoft.com/en-us/library/B3877C5F-D844-F417-AD77-992E03F41BA3.aspx
Windowsに対してrshを行う手順
http://www.buk-u.com/rsh/
RSH Daemon - TetraPod
http://www.xvi.jp/item/146

金曜日, 5月 04, 2007

[VC++]ping

▼質問
ビルドしたら下記のエラーが出た。
「error LNK2019: 未解決の外部シンボル _IcmpSendEcho@32 が関数 "unsigned long __cdecl 関数名(unsigned long,int)" (mailto:YAKKH@Z) で参照されました。 オブジェクト名.obj

▼回答
IcmpSendEcho関係をリンクするライブラリがないと思われる。
下記のサイトでIP Helper APIを使うためには、Platform SDKをインストールと書いてあった。

IPHLPAPIを使ってWindowsでネットワーク設定いじるプログラムを書く
http://www.geekpage.jp/programming/iphlpapi/

Windows Platform SDKのインストール方法もこのサイトに説明されていた。感謝!感謝!

Windows Platform SDKのインストール
http://www.geekpage.jp/programming/platform-sdk/

VC++2005なのでこっちの説明の方が良さそうである。

Visual C++ Express Editionを使ってみる(Windows Platform SDK編)
http://freepg.fc2web.com/cpp/topic_vce_001.html

「IPHlpApi.Lib」をリンクした解決した。

■参考サイト
IPHLPAPI(IP Helper API)の使い方 [自作ping]
http://www.geekpage.jp/programming/iphlpapi/send-icmp.php

▼質問
ビルドしたら下記のエラーが出た。
「error LNK2019: 未解決の外部シンボル _inet_addr@4 が関数 "unsigned long __cdecl 関数名(char *,int)" (?関数名@@YAKPADH@Z) で参照されました。 オブジェクト名.obj 」

▼回答
IPアドレスをLong型の数値に変換するinet_addr関数を使用すると「Ws2_32.lib」をリンクしないと
いけないようだ。

木曜日, 5月 03, 2007

[VC++]文字列

▼質問
wchar_t型からchar型に変換するにはどうしたらいいの?

▼回答

TCHAR * str1 = TEXT("テスト");
TCHAR str2[32];
lstrcpy(str2 , str1);


■参考サイト
方法 : さまざまな文字列型間で変換する
http://msdn2.microsoft.com/ja-jp/library/ms235631(VS.80).aspx

水曜日, 5月 02, 2007

[VC++]oo4o接続・設定

▼質問
リビルドすると下記のエラーが発生する。
「fatal error C1083: include ファイルを開けません。'oracl.h': No such file or directory ファイルパス 行番号」

▼回答
オラクルがインストールされた下記のパスのどちらかを「構成プロパティ」→「C/C++」→「全般」→
「追加のインクルード ディレクトリ」に追加する。
クライアントインストール:\oracle\product\10.2.0\client_1\oo4o\CPP\INCLUDE
オラクルインストール:\oracle\product\10.2.0\db_1\oo4o\CPP\INCLUDE

▼質問
リビルドで下記のエラーが出る。
「error LNK2019: 未解決の外部シンボル "__declspec(dllimport) public: int __thiscall ODynaset::Close(void)" (__imp_?Close@ODynaset@@QAEHXZ) が関数 __catch$_ファイル名@4$0 で参照されました。 オブジェクトファイル名」

▼回答
オラクルがインストールされた下記のパスのどちらかを「構成プロパティ」→「リンカ」→「入力」→
「追加の依存ファイル」に追加する。
クライアントインストール:\oracle\product\10.2.0\client_1\oo4o\CPP\LIB\ORACLM32.LIB
オラクルインストール:\oracle\product\10.2.0\db_1\oo4o\CPP\LIB\ORACLM32.LIB

[C言語orC++]VC++2005へのバージョンアップ

▼質問
C言語で書かれたソースをVC++2005でリビルドすると下記のエラーが出る。
「警告 1 warning C4996: 'strcpy' が古い形式として宣言されました。 ファイルパス 行番号」

▼回答
VC++2005のランタイムから既存標準関数のセキュリティが持つ脆弱性の対応で
新しい関数が提供されたため。

回避策として次のコードを記述すると無効にできる。
#pragma warning(disable : 4996)

他の回避方法として次の#defineのどちらかを定義すればと書いてあったので
試してみたが警告は消えなかった。なぜ?

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
#define _CRT_SECURE_NO_DEPRECATE 1

理由はわからないがヘッダファイルの「stdafx.h」に記述したら消えたぞ!
記述の場所は、ヘッダーファイルが記述している前にしないといけないみたい。

「_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES」の定義は消えない
警告もあるので「_CRT_SECURE_NO_DEPRECATE」を使った方が良いみたい。(^^)v

プロジェクトのプロパティでも定義できるようなのでそちらも試してみました。

「構成プロパティ」->「C/C++」->「プリプロセッサ」->「プリプロセッサの定義」の
末尾に 追加する。

この他にも下記の関数も変更になったようだ。

従来の関数:セキュアな関数
strcpy:strcpy_s
strncpy:strncpy_s
printf:printf_s
asctime:asctime_s
ctime:ctime_s

■参考サイト
Visual C++ 2005 C/C++ランタイム ライブラリ新機能概要
http://www.microsoft.com/japan/msdn/security/demo/runtime.aspx
CRT のセキュリティ強化
http://msdn2.microsoft.com/ja-jp/library/8ef0s5kh(VS.80).aspx


;_CRT_NONSTDC_NO_DEPRECATE;_USE_32BIT_TIME_T

▼質問
ライブラリのリンクってどうやってやるの?

▼回答
こんな方法があるよ。

プロジェクトのプロパティでライブラリのファイルを絶対パス(フルパス)で直接設定する方法と
ライブラリファイルとパスを分けて設定する方法があるよ。

前者
「構成プロパティ」->「リンカ」->「入力」->「追加の依存ファイル」に「絶対パス(フルパス)」
を指定する。

後者
「構成プロパティ」->「リンカ」->「入力」->「追加の依存ファイル」にリンクするライブラリ
ファイルを指定して、そのライブラリまでのパスを下記のプロパティに設定する。
「構成プロパティ」->「リンカ」->「全般」->「追加のライブラリ ディレクトリ」

月曜日, 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