- PR -

[VC2005]VC++6.0のDLLへ配列のポインタを渡す方法

1
投稿者投稿内容
ccgrape
会議室デビュー日: 2008/01/18
投稿数: 7
投稿日時: 2009-04-02 10:40
VC++6.0で作成したDLLを
VC++2005(C++/CLI)のアプリケーションから
呼び出す処理を作成しております。

DLLとのIF関数に
配列へのポインタを引数として渡す関数HogeFunc()があります。
short HogeFunc(long (* Ary)[10]);

VC++2005(C++/CLI)からHogeFunc()を使用する場合、

array<long>^ CLI_Ary = gcnew array<long>(10);
pin_ptr<long> CLI_Ary_Ptr = &CLI_Ary[0];
HogeFunc(CLI_Ary_Ptr);

としたかったのですが、
'cli::pin_ptr<Type>'から'long (*)[10]'に変換できません。
とのエラーになります。

どのように渡せば良いのでしょうか?

どなたかアドバイス頂けませんでしょうか?
よろしくお願いします。

[環境]
Visula Studio 2005 Professional Edition
Visula C++ 2005
Windows 2000
Blue
大ベテラン
会議室デビュー日: 2005/09/12
投稿数: 230
お住まい・勤務地: 知っている人は知っている
投稿日時: 2009-04-02 10:52
C++/CLI側も

long Ary[10];

ではやれないのでしょうか?
やれなければ、memcpyとかしてコピーするか、
いっそのこと、DllImportでマーシャリングするとか。
(long (*)[10]に対応する型は知らん。)


純粋なC++でも

long* と long (*)[size]

は別の型です。
ccgrape
会議室デビュー日: 2008/01/18
投稿数: 7
投稿日時: 2009-04-02 18:00
Blue様

ご返答ありがとうございます。

少し教えて頂けないでしょうか?

C++/CLI(マネージコード内)で配列を
"long Ary[10];"の様に宣言し関数へ渡す場合は、
pin_ptrでアドレスを操作されないようにしなくてはいけないのでしょうか?
それともHogeFunc(&Ary);
の様に記述しても良いのでしょうか?

pin_ptrを使う場合、どのように記述すれば良いのでしょうか?

アドバイス頂けないでしょうか?
C++/CLIに慣れていない物で初歩的な質問ですいません。
Blue
大ベテラン
会議室デビュー日: 2005/09/12
投稿数: 230
お住まい・勤務地: 知っている人は知っている
投稿日時: 2009-04-03 15:50
マネージドの領域ではないので、C++と同じ記述です。
→pin_ptrは使わない。

引用:
それともHogeFunc(&Ary);
の様に記述しても良いのでしょうか?


ここで聞く前に実際に試してみては?
C++の文法的には間違ってはいません。
ccgrape
会議室デビュー日: 2008/01/18
投稿数: 7
投稿日時: 2009-04-06 17:31
Blue様

アドバイスありがとうございます。

動作の確認ができました。
ありがとうございました。

自分でも試してみたのですが、
『コンパイルも通り、たまたま正常に動作した様に見えるが、
根本的に問題がある』
かもしれないと思い、
質問させて頂きました。

C++6.0からのソフトの移植を行っているため、
ネイティブとマネージコードが混在し、
どのように記述すれば問題ないのか迷っておりました。

どうもありがとうございました。
1

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