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

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

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

Re[2]: C#からC++dll参照時に落ちてしまう。


(過去ログ 98 を表示中)

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

■58631 / inTopicNo.1)  C#からC++dll参照時に落ちてしまう。
  
□投稿者/ ZOON (5回)-(2011/04/19(Tue) 09:48:12)

分類:[C#] 

開発環境:VisualStudio2008
使用言語:C#

C#で作成されたアプリからC++で作成されたdllを参照し、GetValueという関数から値を取得する実装を行っていました。
当初下記@のように引数が4つでしたが、Aのように引数を一つ増やし5つにしたところ、その関数を叩くと落ちるようになりました。
落ちる原因としては第5引数のメモリ(?)が何か不正な状態になっているようで、第5引数の値を使用しようとすると落ちます。

---下記@AはC++での実装---
@
GetValue(
IN DWORD dwBarType,
IN DWORD dwSizeNB,
OUT LPDWORD lpdwBarSizeB,
OUT LPDWORD lpdwBarSizeS )

A
GetValue(
IN DWORD dwBarType,
IN DWORD dwSizeNB,
IN DWORD dwResolution,
OUT LPDWORD lpdwBarSizeB,
OUT LPDWORD lpdwBarSizeS )

---下記1、2はC#での実装---
[DllImport("test.dll", CharSet = CharSet.Unicode, EntryPoint = "GetValue")]
static extern bool GetValue(uint barcodeType
, uint black1
 , uint resolution
, uint[] blacks
, uint[] whites);


ソースコード的には落ちるような実装はされておらず、引数を一つ追加しただけで落ちるようになってしまいました。
また、渡し口での値は正しいことが確認できており、受け口では第5引数が何やら不正な値になっています。


現状、原因もわかりませんので対応策が思いつきません。
何かありましたら、ご教授して頂ければと思います。

引用返信 編集キー/
■58632 / inTopicNo.2)  Re[1]: C#からC++dll参照時に落ちてしまう。
□投稿者/ 774RR (587回)-(2011/04/19(Tue) 10:09:14)
呼び出し規約は一致してるの? __cdecl __stdcall __thiscall 類
__declspec(dllimport) __declspec(dllexport) などは書き込みの際に省略したの?
byte[] に対して正しく new byte[size] してあるわけ?
C++ 側にサイズを正しく渡してバッファオーバーランしないようになっているように見えない。

などなどソースコード断片が断片杉なんで何も判断できない。
その割には考察抜けというか記述抜けが多すぎる。チェックできるところはいくつもありそうだ。

> ソースコード的には落ちるような実装はされておらず、
思い込みとか。
引用返信 編集キー/
■58634 / inTopicNo.3)  Re[2]: C#からC++dll参照時に落ちてしまう。
□投稿者/ TinqWill (1回)-(2011/04/19(Tue) 19:48:37)
TinqWill さんの Web サイト
このサイトによりますと、オーバーロードのあるC++のDLLは不要な情報がつくため、C#からDllImportすることはできないようです。
http://xptn.dtiblog.com/blog-entry-109.html

C++/CLIでラップをするか、DLLの側で書き直す必要があるようです。
引用返信 編集キー/
■58638 / inTopicNo.4)  Re[1]: C#からC++dll参照時に落ちてしまう。
□投稿者/ Azulean (728回)-(2011/04/19(Tue) 22:39:38)
No58631 (ZOON さん) に返信
> 落ちる原因としては第5引数のメモリ(?)が何か不正な状態になっているようで、第5引数の値を使用しようとすると落ちます。

C# 側のプログラムはきちんと 5 つの引数に書き直してビルドしなおした exe が実行されていますか?
一度、実行している exe を消してみて、再度ビルドしてみてきちんと更新されていることもご確認ください。
(念のため。大丈夫だと思っていると、実は変なところでミスってたりすることが私もよくあります)


No58634 (TinqWill さん) に返信
> このサイトによりますと、オーバーロードのあるC++のDLLは不要な情報がつくため、C#からDllImportすることはできないようです。

1と2は変更前と変更後を示しているだけであって、オーバーロードしているわけではないと思いますよ。
引用返信 編集キー/
■58640 / inTopicNo.5)  Re[2]: C#からC++dll参照時に落ちてしまう。
□投稿者/ TinqWill (2回)-(2011/04/20(Wed) 00:10:49)
TinqWill さんの Web サイト
> 1と2は変更前と変更後を示しているだけであって、オーバーロードしているわけではないと思いますよ。
あ、本当ですね・・・
ごめんなさい。勘違いしていました・・・
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -