- PR -

Visual C#でBCB5.0で書かれたDLLを利用できますでしょうか?

1
投稿者投稿内容
かったろう
会議室デビュー日: 2004/07/07
投稿数: 5
投稿日時: 2004-07-07 21:42
最近、C#をかじり中なのですが、BCB5.0で作ったDLLをC#から呼び出したいのですが、どうしてもうまくいきません。なんとか、DLLの中の関数は利用はできているみたいなのですが、思っているような動作をしてくれません。よろしかったら、アドバイスお願いします。
-----------------------message.dll(BCB5.0で作成)-----------------------------
extern "C" __declspec(dllexport) void WINAPI SetInt(char*, int, int, int);
void WINAPI SetInt(char* buffer, int size, int position, int value)
{
if(size < position + sizeof(int)) return;
memcpy(&buffer[position], &value, sizeof(int));
};
-------------------------------------------------------------------------------
上は、DLLの一部(使いたい関数を抜粋しました。)です。buffer配列にポジションとサイズを与えて、valueを書き込ませています。


------------------ test.cs(C#で作成したテストプログラム)-----------------------
public class ConcurrentorMessageCS
{
//関数宣言
[DllImport("DataRW.dll")]
public static extern void SetInt(ref byte buffer, int size, int position, int value);

private byte[] Buffer = new byte[100];
int value=12;
int position=0; //とりあえず頭に書き込みます。
//ここで使用
SetInt(ref Buffer[0], 4, position, value); //int型は、4バイトなので直接いれてます。^^;

}
-------------------------------------------------------------------------------
上がテストプログラムです。

コンパイルは通りますが、Buffer配列に何も残りません。どこが怪しいか是非ご教授お願いいたします。それと、4などとかっこわるい書き方でなく、C言語のsizeofみたいなスマートの書き方あったら、お願いします。(sizeofは、C#では、unsafeコードでしか使えませんよね!? unsafeコードはスマートなんでしょうか?)

iStation
大ベテラン
会議室デビュー日: 2003/12/08
投稿数: 158
投稿日時: 2004-07-07 21:51
StringBuilderを使えば良いのでは?
かったろう
会議室デビュー日: 2004/07/07
投稿数: 5
投稿日時: 2004-07-07 23:08
できれば、byte配列で完成させてみたいのですが、byte配列では、ちょっと無理がありますでしょうか?
ya
大ベテラン
会議室デビュー日: 2002/05/03
投稿数: 212
投稿日時: 2004-07-08 01:24
コード:

public static extern void SetInt(ref byte buffer, int size, int position, int value);


とりあえずここは

コード:

public static extern void SetInt(sbyte[] buffer, int size, int position, int value);


こうかな。

sizeofについては気になるのなら

コード:

private const int INT_SIZE = 4;


ぐらいでいいかと。
かったろう
会議室デビュー日: 2004/07/07
投稿数: 5
投稿日時: 2004-07-08 19:44
yaさん、ありがとうございました。
refをはずしてみて、実行しましたら、うまくFBuffer配列にデータをいれることができました。

refは、なくてもよかったんですね。ついつい、C#にポインタがないことばかり意識していまして、関数の配列渡しを忘れておりました。^^;


[ メッセージ編集済み 編集者: かったろう 編集日時 2004-07-08 19:52 ]
1

スキルアップ/キャリアアップ(JOB@IT)