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

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

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

Re[2]: vb.netからc言語で作成されたdllの呼び出し


(過去ログ 131 を表示中)

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

■77456 / inTopicNo.1)  vb.netからc言語で作成されたdllの呼び出し
  
□投稿者/ なっちゃん (1回)-(2015/10/21(Wed) 16:21:24)

分類:[.NET 全般] 

.net、C言語初心者です。

OS:Win8
Visual Studio2013

C言語のソースは以下のようになっていて、
LPSTR test(LPSTR input)
{

vb.netより以下のようにして、結果を画面に表示しようと思ったのですが、
なかなかうまくいきません。フォームも起動されません。
そもそもvb.netからC言語で作成されたdllは呼び出し可能なのでしょうか?

Public Class Form1

<System.Runtime.InteropServices.DllImport("test.dll")> _
Private Shared Function test( _
ByVal i_str As System.Text.StringBuilder) As System.Text.StringBuilder
End Function

'Form1のロード時にtestを呼び出し、結果を画面に表示する。
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

' StringBuilder クラスの新しいインスタンスを生成する
Dim in_sb As New System.Text.StringBuilder()
Dim out_sb As New System.Text.StringBuilder()

' 文字列を追加する
in_sb.Append("abcde)

' ここでDLLのtestを呼び出す。
out_sb = test(in_sb)
Label1.Text = out_sb.ToString

End Sub
End Class

引用返信 編集キー/
■77457 / inTopicNo.2)  Re[1]: vb.netからc言語で作成されたdllの呼び出し
□投稿者/ 774RR (329回)-(2015/10/21(Wed) 16:50:21)
その質問文のソースコードは web browser 上での手書き?なんかすっげー微妙なんだけど...

C 側が LPSTR (char) であるのに対して DllImport で CharSet.Ascii が抜けてるせいだと思う。


引用返信 編集キー/
■77458 / inTopicNo.3)  Re[2]: vb.netからc言語で作成されたdllの呼び出し
□投稿者/ Hongliang (361回)-(2015/10/21(Wed) 17:10:21)
返値にStringBuilderは確か定義不可だったような。
返値としてIntPtr型で受け取り、受け取った後でMarshal.PtrToStringAnsiメソッドで文字列変換するのが安定するかと。

というかこのtest関数の返値LPSTRはどうメモリ管理されているんでしょうか?
引用返信 編集キー/
■77459 / inTopicNo.4)  Re[2]: vb.netからc言語で作成されたdllの呼び出し
□投稿者/ なっちゃん (3回)-(2015/10/21(Wed) 17:54:35)
No77457 (774RR さん) に返信
> その質問文のソースコードは web browser 上での手書き?なんかすっげー微妙なんだけど...
>
> C 側が LPSTR (char) であるのに対して DllImport で CharSet.Ascii が抜けてるせいだと思う。
>

早速のご回答大変助かります。
すみません。ソース張り付けてブラウザ上で変更した部分が微妙になってしまいました。
CharSet.Ascii勉強になりました。ありがとうございます。
引用返信 編集キー/
■77460 / inTopicNo.5)  Re[3]: vb.netからc言語で作成されたdllの呼び出し
□投稿者/ ???????? (1回)-(2015/10/21(Wed) 17:58:42)
No77458 (Hongliang さん) に返信
> 返値にStringBuilderは確か定義不可だったような。
> 返値としてIntPtr型で受け取り、受け取った後でMarshal.PtrToStringAnsiメソッドで文字列変換するのが安定するかと。
>
> というかこのtest関数の返値LPSTRはどうメモリ管理されているんでしょうか?

test関数のメモリ管理がまだよく解読できていなくてすみません。。

Hongliangさんのおっしゃる通り、以下のように変更したらうまく動いてそうです。
ありがとうございました!

解決済み
引用返信 編集キー/
■77461 / inTopicNo.6)  Re[4]: vb.netからc言語で作成されたdllの呼び出し
□投稿者/ Azulean (526回)-(2015/10/21(Wed) 21:14:09)
No77460 (???????? さん) に返信
>>というかこのtest関数の返値LPSTRはどうメモリ管理されているんでしょうか?
>
> test関数のメモリ管理がまだよく解読できていなくてすみません。。

このあたり放置せず、ちゃんと理解するように努力した方がいいですよ。
放置すると、メモリがリークする(解放されず、使用量が蓄積していく)か、時々アクセス違反 = AccessViolationException が発生するといった重篤な不具合につながります。
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -