小弟遇到一个问题,调用外部非托管的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);后面就不执行了,请教一下应该怎么调用呢

解决方案 »

  1.   

    [DllImport("kingvewcliend.dll",
     EntryPoint="GetItemNames",
     ExactSpelling=false,
     CallingConvention=CallingConvention.Cdecl)]
      

  2.   

    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);
                    lstNames.Add(itemsNames);
                }
                lstNames.ForEach(p => MessageBox.Show(p)); 
    [DllImport("kingvewcliend.dll",
     EntryPoint="UpStartLoginInfo",
     ExactSpelling=false,
     CallingConvention=CallingConvention.Cdecl)]
    private static extern int GetItemNamesData(out string sName, ushort wItemId);这样
      

  3.   

    调用GetItemNamesData还是一样不执行之后的代码。如果参数不加out会执行,但是只是传的副本,所以没效果。
      

  4.   

    将外部的dll引用过来,再调用他的函数
      

  5.   

    换成Ref呢
    ref可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所以你必须初始化一次。
      

  6.   

    注册这个DLL 。项目添加引用行不行?
      

  7.   

    http://s.yanghao.org/program/viewdetail.php?i=40207
      

  8.   

       [DllImport("kingvewcliend.dll")]
            public static extern int GetItemNames(StringBuilder  sName, int wItemId);
        StringBuilder regname = new StringBuilder(256); 
    GetItemNames(regname, i);
      

  9.   

    http://www.cnblogs.com/badnewfish/archive/2008/12/18/1357335.html
      

  10.   

    http://www.cnblogs.com/yongbin621/archive/2009/5/7.html
      

  11.   

    ref之前试过了,我也给itemsNames附了初值,还是那句代码后面的直接不执行。也不报错。奇怪的是事情。
      

  12.   

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

  13.   

    还是得用StringBilder可变字符串对象啊。哎。。没用过。。过会结贴了
      

  14.   

    试试将第一个类型改为c#中的System.Text.StringBuilder(255) 类型试试
      

  15.   

    Dim s_ReturnValue As String * 255    to   Dim s_ReturnValue As New VB6.FixedLengthString(255)When I get to System_SetItems which expects an integer value;Call GetPrivateProfileString("App", "Items", "192", s_ReturnValue.Value, 255, INI_Filename)Call System_SetItems(CInt(s_ReturnValue.Value))   <<<--------------If I look at s_ReturnValue in the previous line, it shows "192        with no trailing double quote, which I imaging would be 250 or so places to the rightI get system exception "input string was not in a correct format"Anyone been here? Thank you for any ideas.Greg
    ReplyQuote Answers 
    Friday, August 25, 2006 1:55 PM 
        
    0Sign In to Vote 
    Try defining s_ReturnValue as System.Text.StringBuilder(255) instead of using the VB6 library data type.