读书人

代码不实施

发布时间: 2012-12-17 09:31:40 作者: rapoo

代码不执行
小弟遇到一个问题,调用外部非托管的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);


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);

这样
[其他解释]

引用:
[DllImport("kingvewcliend.dll",
EntryPoint="GetItemNames",
ExactSpelling=false,
CallingConvention=CallingConvention.Cdecl)]
试了下,还是一样。。谢谢了
[其他解释]
引用:
public static extern int GetItemNames(out string sName, ushort wItemId);
List<string> lstNames = new List<string>();
for (int i = 1; i < ReadItemNo(); i++)
{
……
调用GetItemNamesData还是一样不执行之后的代码。如果参数不加out会执行,但是只是传的副本,所以没效果。
[其他解释]
将外部的dll引用过来,再调用他的函数
[其他解释]
换成Ref呢
ref可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所以你必须初始化一次。
[其他解释]
没见过这个API,帮你顶一下
[其他解释]
注册这个DLL 。项目添加引用行不行?
[其他解释]
http://www.cnblogs.com/badnewfish/archive/2008/12/18/1357335.html
[其他解释]
http://www.cnblogs.com/yongbin621/archive/2009/5/7.html
[其他解释]
引用:
换成Ref呢
ref可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所以你必须初始化一次。
ref之前试过了,我也给itemsNames附了初值,还是那句代码后面的直接不执行。也不报错。奇怪的是事情。
[其他解释]
引用:
[DllImport("kingvewcliend.dll")]
public static extern int GetItemNames(StringBuilder sName, int wItemId);


StringBuilder regname = new StringBuilder(256);
GetItemNa……
正解。谢谢哥们。也谢谢其他朋友
[其他解释]
还是得用StringBilder可变字符串对象啊。哎。。没用过。。过会结贴了
[其他解释]
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 right

I 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.
[其他解释]
试试将第一个类型改为c#中的System.Text.StringBuilder(255) 类型试试

读书人网 >C#

热点推荐