VBとC#の違いを教えてください

54 views
Skip to first unread message

たろサ

unread,
Sep 5, 2011, 12:18:03 PM9/5/11
to androidi...@googlegroups.com
 山本です。

 VBとC#の違いを教えてください。

--VBの場合、下記のようにDeclareされていまして、
Declare Function DDMgets Lib "ds35iowd.dll" (ByVal dsn As Short, ByVal msg As String) As Integer
--下記のような呼び出しで、
Dim ret As Integer
Dim str_Renamed As String

str_Renamed = Space(1024)
ret = modPCI.DDMgets(0, str_Renamed)

retに6が戻り、str_Renamedに"KINDS, .."(1024バイト)と文字が入って戻ります。
retの値は、str_Renamedに書き込んだ文字数です。

これをC#に移植しています。
--C#の場合、下記のようにDllImportしまして、
[DllImport("ds35iowd.dll")]
public static extern int DDMgets(short dsn, String msg);
--
int ret;
String str_Renamed = string.Empty;

for (int i = 0; i < 1024; i++) { str_Renamed = string.Concat(str_Renamed, " "); }
ret = modPCI.DDMgets(0, Renamed);

retに6が戻り、str_Renamedに" .."(1024バイト)と文字が入って戻ります。
どうも、dll内でstr_Renamedに文字列が代入できていないようです。

 これの原因は、何だと思いますか?

 VBで動いているので、C#でもこれでいいと思うのですが、違うのでしょうか。

 教えてください。

 よろしくお願いします。

--
山本三七男 (Minao Yamamoto) ---------------- ハンドル:たろサ -----
E-Mail: taro...@gmail.com

たろサ

unread,
Sep 5, 2011, 12:37:26 PM9/5/11
to androidi...@googlegroups.com
 山本です。

 良く見ると、Declare で、 ByVal msg As String)と値渡しをしているのに、
modPCI.DDMgets(0, str_Renamed)で、str_Renamedの中身が書き換わって返って
きています。
 これって、VBの機能なんでしょうか。

 C#だと、ref で渡す必要があるのですが、DDMgets(short dsn, ref String
msg); で定義して、 modPCI.DDMgets(0, ref str_Renamed)で渡すと、
「保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他
のメモリが壊れていることが考えられます。」
言われて、とまりました。

 どうすればいいでしょうか。

Reply all
Reply to author
Forward
0 new messages