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

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

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

Re[1]: VC++で作成したdll関数に渡す引数


(過去ログ 106 を表示中)

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

■63477 / inTopicNo.1)  VC++で作成したdll関数に渡す引数
  
□投稿者/ しぃ (1回)-(2012/08/31(Fri) 08:43:51)

分類:[C/C++] 

昔、会社にいた人が作ったVC++の画像処理プログラムを流用し、VB(2008)でもその処理を利用できるようにしようとしています。
VC++には詳しくなく、私のスキルではVBに移植するのは難しいと考え、VC++でdllを作成し、これを
<System.Runtime.InteropServices.DllImport("xxxxx")>のような形で利用しようと考えています。
ネットで色々と調べ、見よう見まねでdllを作成し、VB側から画像ファイル名を引数にして渡し、その画像の処理を行うことに成功しましたが、
場合によっては、画像ファイルではなく、Bitmapインスタンスをそのまま渡したい場合があります。
とりあえずは、Bitmapをファイルに保存し、このファイルを渡すことでこのdllで処理できますが、
Bitmapインスタンスそのものをdll側に渡すことは可能なのでしょうか?
VB側もVC++のdll側も修正は可能です(ただし、私のスキルによる)。
よろしくお願い申し上げます。
引用返信 編集キー/
■63478 / inTopicNo.2)  Re[1]: VC++で作成したdll関数に渡す引数
□投稿者/ じゃんぬねっと (2回)-(2012/08/31(Fri) 09:20:19)
じゃんぬねっと さんの Web サイト
No63477 (しぃ さん) に返信
> 昔、会社にいた人が作ったVC++の画像処理プログラムを流用し、VB(2008)でもその処理を利用できるようにしようとしています。
> VC++には詳しくなく、私のスキルではVBに移植するのは難しいと考え、VC++でdllを作成し、これを
> <System.Runtime.InteropServices.DllImport("xxxxx")>のような形で利用しようと考えています。
> ネットで色々と調べ、見よう見まねでdllを作成し、VB側から画像ファイル名を引数にして渡し、その画像の処理を行うことに成功しましたが、
> 場合によっては、画像ファイルではなく、Bitmapインスタンスをそのまま渡したい場合があります。
> とりあえずは、Bitmapをファイルに保存し、このファイルを渡すことでこのdllで処理できますが、
> Bitmapインスタンスそのものをdll側に渡すことは可能なのでしょうか?
> VB側もVC++のdll側も修正は可能です(ただし、私のスキルによる)。
> よろしくお願い申し上げます。

たとえばバイナリで渡せばなんとでもできます。C 側は先頭アドレスさえわかれば良い。
そのあとそのまま加工する処理を実装する際は、32bit でなければ「4 バイト境界」などに気をつけてください。
引用返信 編集キー/
■63479 / inTopicNo.3)  Re[1]: VC++で作成したdll関数に渡す引数
□投稿者/ オショウ (13回)-(2012/08/31(Fri) 11:28:16)
> Bitmapインスタンスそのものをdll側に渡すことは可能なのでしょうか?

  マネージ側インスタンスをアンマネージ側で利用することは不可能です。
  ただ、C++ CLI に書き換えれば、可能ですが・・・

  VC++で作られたDLLでは、どんな機能を担っているのでしょうか?
  その機能次第で手間や方法は変化します。

以上。参考まで
引用返信 編集キー/
■63490 / inTopicNo.4)  Re[1]: VC++で作成したdll関数に渡す引数
□投稿者/ Azulean (25回)-(2012/09/01(Sat) 00:37:44)
No63477 (しぃ さん) に返信
> Bitmapインスタンスそのものをdll側に渡すことは可能なのでしょうか?

Bitmap クラスは .NET のクラスなので、DllImport で渡すことは実質的にできません。
C++/CLI でラップして .NET クラスとして DLL を見せるようにすれば渡せますが、C++/CLI の DLL の中で結局、Bitmap を Lock してポインタを渡すことになるので、おすすめできません。(面倒くさい&C++/CLI を知る必要がある)

LockBits した上で Scan0 を渡せば、じゃんぬねっとさんが書かれているように DLL にはポインタとして渡せますので C++ ネイティブ DLL から DIB の書き換え、読み取りが可能でしょう。


> (ただし、私のスキルによる)。

余計なお世話かもしれませんが気になったので。

「やりたいこと」に対して、「そのためにやらなければならないこと」があります。
「やらなければならないこと」に対してスキルが不足するのであれば、実現するためにスキルを上げていただくか、あきらめるかになりますので、「私のスキルによる」と書くことに意味はないかと思います。
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -