人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

C#.net に関する質問です。

COMオブジェクトをtlbimpして.netで使えるようにしました。

public virtual extern void AllNames(_KindFlag Kind, out string[] Codes, out string[] Names);


string[] codes = new string[]{};
string[] names = new string[]{};
name.GetType().InvokeMember(
”AllNames”,
bindingFlags.Public | BindingFlags.Instance | BindingFlags.OptionalParamBinding | BindingFlags.InvokeMethod,
null,
name,
new object[]
{_KindFlag.All, codes, names});

Console.WriteLine(hoge1.Length+”¥t”+hoge2.Length);

ところがnames[],codes[]のlengthは共に0を返します。これは、object[]で受けたものをstring[]に引き渡す必要があるようなのですが、そこがうまくいっていないようです。

string[]を引き渡すにはどうしたらいいでしょうか?これは元々他サイトでお伺いしたものなのですが、ParameterInfo、Binderなどの設定をどうすればいいか分かりませんでした。

よろしくお願いします。

●質問者: expansion05
●カテゴリ:コンピュータ 科学・統計資料
✍キーワード:.NET ALL C# Console name
○ 状態 :キャンセル
└ 回答数 : 1/1件

▽最新の回答へ

1 ● cx20

http://www.panrolling.com/pansoft/amarket/

Pan;パンローリング 相場アプリケーション

ParameterInfo、Binder は調べていないのですが、そもそも

InvokeMember でメソッドを呼び出す必要性はあるのでしょうか?

(InvokeMember を呼び出すことが目的でしたら、スミマセン。)

恐らく、使用されている COM DLL は、上記 URL の amarket.dll だと思われます。

下記はマニュアルに記載してあった関数の使い方です。

--------------------------------------------------------------

AllNamesメソッド (Namesクラス)

Sub AllNames(ByVal Kind As KindFlag, Codes() As String, Names() As String)

Enum KindFlag

AM_KINDFLAG_SPOTS = 1

AM_KINDFLAG_FUTURES = 2

AM_KINDFLAG_ALL = 3

End Enum

例)

Dim Names As New ActiveMarket.Names

Dim C() As String, N() As String

Names.AllNames AM_KINDFLAG_SPOTS, C, N

--------------------------------------------------------------

この COM DLL(amarket.dll)を、参照設定にて追加したところ、

オブジェクトブラウザには、

void INames.AllNames( ActiveMarket._KindFlag, out System.Array, out System.Array );

と表示されました。

> public virtual extern void AllNames(_KindFlag Kind, out string Codes, out string Names);

例示された関数プロトタイプと異なるのがちょっと気になるところですが・・・。

とりあえず、これらの情報に参考にコードを書いて見ました。

--------------------------------------------------------------

1. [ファイル] - [新規作成] - [プロジェクト]

2. [Visual C# プロジェクト] - [Windows アプリケーション]

3. [プロジェクト] - [参照の追加] - [COM] タブにて以下の COM を参照設定

Pan Active Market Database 1.2 / COM / C:¥Program Files¥Pan¥amarket.dll

4. ボタンのイベントに処理を追加

private void button1_Click(object sender, System.EventArgs e)

{

ActiveMarket.Names Names = new ActiveMarket.Names();

System.Array codeArray;

System.Array nameArray;

Names.AllNames( ActiveMarket._KindFlag.AM_KINDFLAG_SPOTS, out codeArray, out nameArray );

Console.WriteLine( codeArray.Length + ”¥t” + nameArray.Length );

foreach ( string strCode in codeArray )

{

Console.WriteLine( strCode );

}

foreach ( string strName in nameArray )

{

Console.WriteLine( strName );

}

}

--------------------------------------------------------------

<実行結果>

5 5

1001

1002

1003

1007

1008

日経225

TOPIX(東証指数)

NYドル/円

東京ドル/円

東京ユーロ/円

--------------------------------------------------------------

一応、普通に使えるようです。

<テスト環境>

Windows 2000 Pro (SP4) + Visual Studio .NET 2003

◎質問者からの返答

すみません、SharpDevelopでやってましたが、これのマーシャリングに関するバグのようです。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ