代码不执行

sj490790083 2012-11-26 03:21:16
小弟遇到一个问题,调用外部非托管的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);后面就不执行了,请教一下应该怎么调用呢
...全文
201 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
心灵彩虹 2012-11-26
  • 打赏
  • 举报
回复
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.
心灵彩虹 2012-11-26
  • 打赏
  • 举报
回复
试试将第一个类型改为c#中的System.Text.StringBuilder(255) 类型试试
sj490790083 2012-11-26
  • 打赏
  • 举报
回复
还是得用StringBilder可变字符串对象啊。哎。。没用过。。过会结贴了
sj490790083 2012-11-26
  • 打赏
  • 举报
回复
引用 10 楼 hjywyj 的回复:
[DllImport("kingvewcliend.dll")] public static extern int GetItemNames(StringBuilder sName, int wItemId); StringBuilder regname = new StringBuilder(256); GetItemNa……
正解。谢谢哥们。也谢谢其他朋友
心灵彩虹 2012-11-26
  • 打赏
  • 举报
回复
看下GetItemNames(out itemsNames, (ushort)i);中得两个参数值和vb中得参数值有何区别,另外dll文件是否复制到debug文件夹下
sj490790083 2012-11-26
  • 打赏
  • 举报
回复
引用 6 楼 kongwei521 的回复:
换成Ref呢 ref可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所以你必须初始化一次。
ref之前试过了,我也给itemsNames附了初值,还是那句代码后面的直接不执行。也不报错。奇怪的是事情。
绿领巾童鞋 2012-11-26
  • 打赏
  • 举报
回复
http://www.cnblogs.com/yongbin621/archive/2009/5/7.html
绿领巾童鞋 2012-11-26
  • 打赏
  • 举报
回复
http://www.cnblogs.com/badnewfish/archive/2008/12/18/1357335.html
  • 打赏
  • 举报
回复
[DllImport("kingvewcliend.dll")] public static extern int GetItemNames(StringBuilder sName, int wItemId); StringBuilder regname = new StringBuilder(256); GetItemNames(regname, i);
绿领巾童鞋 2012-11-26
  • 打赏
  • 举报
回复
http://s.yanghao.org/program/viewdetail.php?i=40207
蝶恋花雨 2012-11-26
  • 打赏
  • 举报
回复
注册这个DLL 。项目添加引用行不行?
绿领巾童鞋 2012-11-26
  • 打赏
  • 举报
回复
没见过这个API,帮你顶一下
蝶恋花雨 2012-11-26
  • 打赏
  • 举报
回复
换成Ref呢 ref可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所以你必须初始化一次。
csdn_风中雪狼 2012-11-26
  • 打赏
  • 举报
回复
将外部的dll引用过来,再调用他的函数
sj490790083 2012-11-26
  • 打赏
  • 举报
回复
引用 2 楼 kongwei521 的回复:
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会执行,但是只是传的副本,所以没效果。
sj490790083 2012-11-26
  • 打赏
  • 举报
回复
引用 1 楼 kongwei521 的回复:
[DllImport("kingvewcliend.dll", EntryPoint="GetItemNames", ExactSpelling=false, CallingConvention=CallingConvention.Cdecl)]
试了下,还是一样。。谢谢了
蝶恋花雨 2012-11-26
  • 打赏
  • 举报
回复
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); 这样
蝶恋花雨 2012-11-26
  • 打赏
  • 举报
回复
[DllImport("kingvewcliend.dll", EntryPoint="GetItemNames", ExactSpelling=false, CallingConvention=CallingConvention.Cdecl)]

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧