日期:2014-05-17  浏览次数:21010 次

代码不执行
小弟遇到一个问题,调用外部非托管的dll,SDK中只有VB语言的例子。
VB代码如下

Private Sub commandgetitemname_Click( )
Dim itemNo As Integer
itemNo = ReadItemNo() ‘获得项目总数
Dim result As Integer
Dim re As Integer
Dim i As Integer
Dim regname As String * 255
For i = 0 To itemNo - 1 Step 1 ‘读取各个项目名称,并添加到项目列表框中
result = GetItemNames(regname, i)
If result <> 0 Then
MsgBox (result)
Return
End If
List1.AddItem (regname)
Next i

关键就是GetItemNames这个函数的调用,例子中传了一个string类型的参数。代码执行没问题,能获取到。
但是我转成C#应该怎么做呢

[DllImport("kingvewcliend.dll")]
        public static extern int GetItemNames(out string sName, ushort wItemId);
 List<string> lstNames = new List<string>();
            for (int i = 1; i < ReadItemNo(); i++)
            {
                string itemsNames;
                GetItemNames(out itemsNames, (ushort)i);
                lstNames.Add(itemsNames);
            }
            lstNames.ForEach(p => MessageBox.Show(p));


代码执行到GetItemNames(out itemsNames, (ushort)i);后面就不执行了,请教一下应该怎么调用呢

------最佳解决方案--------------------
   [DllImport("kingvewcliend.dll")]
        public static extern int GetItemNames(StringBuilder  sName, int wItemId);


    StringBuilder regname = new StringBuilder(256); 
GetItemNames(regname, i);

------其他解决方案--------------------
[DllImport("kingvewcliend.dll",
 EntryPoint="GetItemNames",
 ExactSpelling=false,
 CallingConvention=CallingConvention.Cdecl)]

------其他解决方案--------------------
看下GetItemNames(out itemsNames, (ushort)i);中得两个参数值和vb中得参数值有何区别,另外dll文件是否复制到debug文件夹下

------其他解决方案--------------------
http://s.yanghao.org/program/viewdetail.php?i=40207
------其他解决方案--------------------


public static extern int GetItemNames(out string sName, ushort wItemId);
 List<string> lstNames = new List<string>();
            for (int i = 1; i < ReadItemNo(); i++)
            {
                string itemsNames;
                GetItemNamesData(out itemsNames, (ushort)i);