小弟遇到一个问题,调用外部非托管的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);后面就不执行了,请教一下应该怎么调用呢
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);后面就不执行了,请教一下应该怎么调用呢
EntryPoint="GetItemNames",
ExactSpelling=false,
CallingConvention=CallingConvention.Cdecl)]
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);这样
ref可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所以你必须初始化一次。
public static extern int GetItemNames(StringBuilder sName, int wItemId);
StringBuilder regname = new StringBuilder(256);
GetItemNames(regname, i);
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.