C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: VB2005からDLL(VC6.0)への配列渡しについて


(過去ログ 17 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■6715 / inTopicNo.1)  VB2005からDLL(VC6.0)への配列渡しについて
  
□投稿者/ onon (1回)-(2007/08/22(Wed) 17:35:06)

分類:[VB.NET/VB2005] 

VB2005からDLL(VC6.0)へ配列を渡したいのですが、
VB2005では、配列がメモリ上で連続していない(配列は参照型)ため、
下記コード「hoge(num(0), 5)」で、numの先頭ポインタがDLLに渡って、
配列1番目の実体は取り出せるが、配列2番目以降が連続していないため、取りだせない

---<VB2005>---------------------------------------------------------------------------
Private Declare Function hoge Lib "hogehoge.dll" (ByRef IntPtr as Integer, _
ByVal Num as Integer) as Integer
Public Class mahi
:

Public Sub mahimahi()

dim sum as Integer
dim num(4) as Integer = {1, 2, 3, 4, 5}

'hogeはnum配列の加算結果を返す
sum = hoge(num(0), 5)
end Sub
end Class
----------------------------------------------------------------------------

VB2005で、配列を連続するメモリで確保する方法はありますか?


引用返信 編集キー/
■6721 / inTopicNo.2)  Re[1]: VB2005からDLL(VC6.0)への配列渡しについて
□投稿者/ Hongliang (173回)-(2007/08/22(Wed) 18:14:13)
Hongliang さんの Web サイト
> VB2005で、配列を連続するメモリで確保する方法はありますか?
無いことは無いですが、ほとんどの場合わざわざそんなことしなくても相互運用マーシャラがうまいことやってくれます。
で、相互運用マーシャラにうまいことやってもらう方法は MSDN の「相互運用性」以下、特に「プラットフォーム呼び出しによるデータのマーシャリング」以下の項目に書かれています。サンプルも豊富です。
引用返信 編集キー/
■6723 / inTopicNo.3)  Re[2]: VB2005からDLL(VC6.0)への配列渡しについて
□投稿者/ onon (2回)-(2007/08/22(Wed) 18:55:38)
No6721 (Hongliang さん) に返信
>>VB2005で、配列を連続するメモリで確保する方法はありますか?
> 無いことは無いですが、ほとんどの場合わざわざそんなことしなくても相互運用マーシャラがうまいことやってくれます。
> で、相互運用マーシャラにうまいことやってもらう方法は MSDN の「相互運用性」以下、特に「プラットフォーム呼び出しによるデータのマーシャリング」以下の項目に書かれています。サンプルも豊富です。

返信ありがとうございます、初心者なのでお手柔らかにお願いします
「マーシャリング」には辿り着いていたのですが、難しく挫折してました

それはDLL(VC6.0)側にも細工が必要なのでしょうか?
ちなみにDLLの方は、手元にDLLしかなくソースがありません。
なので、「配列を連続するメモリで確保」するのが最も手間が少ないかなと思ったんですが、

> 無いことは無いですが、
とは、どのような方法でしょうか?
よろしくお願いします

引用返信 編集キー/
■6731 / inTopicNo.4)  Re[3]: VB2005からDLL(VC6.0)への配列渡しについて
□投稿者/ Hongliang (174回)-(2007/08/22(Wed) 21:40:57)
Hongliang さんの Web サイト
> 返信ありがとうございます、初心者なのでお手柔らかにお願いします
> 「マーシャリング」には辿り着いていたのですが、難しく挫折してました

言葉は難しいですが、要するに異なるプラットフォーム間のオブジェクト表現の違いを吸収する機構です。
それこそ、C/C++ のポインタとマネージドの配列を暗黙に相互変換してくれるものです。暗黙に。

> それはDLL(VC6.0)側にも細工が必要なのでしょうか?

不要と思って構いません。そうじゃないと Win32API も呼び出せないですし。

> ちなみにDLLの方は、手元にDLLしかなくソースがありません。
> なので、「配列を連続するメモリで確保」するのが最も手間が少ないかなと思ったんですが、

学ぶ手間はともかく、実装する手間はよほど大きいです。
マーシャラに任せるなら、全く気にせずそのまま配列のインスタンスを渡すだけですから。
// 呼び出し先の DLL が受け取ったポインタを呼び出し後も保持しちゃうとかなるとそんな単純にもいかなくなりますが。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -