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などの設定をどうすればいいか分かりませんでした。

よろしくお願いします。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2004/12/21 22:06:49
  • 終了:--

回答(1件)

id:cx20 No.1

cx20回答回数607ベストアンサー獲得回数1082004/12/22 04:27:14

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

id:expansion05

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

2004/12/22 08:34:27

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません