vb.net DLL调用出现问题。急。。

xiaobeibei626 2010-01-21 05:55:22
函数如下:
Private Function GDW_init() As Int16 '高德威车牌识别
Dim uiDataMsgNo As Long = 1025
Dim uiReConnectMsg As Long = 1026
Dim uiDisconnectMsg As Long = 1027
If GDW_Connect(Me.Handle.ToInt32, uiDataMsgNo, uiReConnectMsg, uiDisconnectMsg) = 0 Then
Return 0
Else
Return 1
End If
End Function


在模块中做如下声明:
Public Declare Function GDW_Connect Lib "GDW_VPDCommDll.dll" (ByVal nMsgHandle As Long, ByVal uiDataMsgNo As Long, ByVal uiReConnectMsg As Long, ByVal uiDisconnectMsg As Long) As Long

遇到的问题: 程序运行时,GDW_init()中参数uiDataMsgNo 为1025,但传入到"GDW_VPDCommDll.dll"中参数值变成了0. 也就是说调用DLL时参数不对。最终导致GDW_init() 返回值为错。我学习VS没有多久,猜想是DLL调用方式的问题。请各位帮忙解决。谢谢。

【附录】 以下是主界面的load过程全代码(我想会不会和Imports System.Runtime.InteropServices 有关。请各位指导)
Imports System.Data.SqlClient
Imports System.Data
Imports System.Text
Imports System.Net
Imports System.Threading
Imports System.Runtime.InteropServices

Public Class caiji

Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Integer, ByVal nIndex As Integer, ByVal dwNewLong As DelegateInterceptWndProc) As Integer
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Integer, ByVal nIndex As Integer) As Integer
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Integer, ByVal hwnd As Integer, ByVal Msg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer

Private Sub caiji_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

If GDW_init() = 0 Then '车牌识别器连接成功
ToolStripStatusLabel5.Text = "车牌识别器连接: 成功"
ToolStripStatusLabel5.Image = My.Resources.green32_1
ToolStripStatusLabel5.ForeColor = Color.Green
Else
MsgBox("初始化车牌识别器失败,系统不能自动识别车牌。", MsgBoxStyle.Information, "提示")
ToolStripStatusLabel5.Text = "车牌识别器连接: 失败"
ToolStripStatusLabel5.Image = My.Resources.red16_1
ToolStripStatusLabel5.ForeColor = Color.Red
End If

'*==========================================================
g_prevWndproc = GetWindowLong(Me.Handle.ToInt32, GWL_WNDPROC) '// 获取当前消息处理句柄(Me.hwnd = Me.Handle.ToInt32)
SetWindowLong(Me.Handle.ToInt32, GWL_WNDPROC, myFunc) '// 设置当前消息处理函数.GWL_WNDPROC=-4
GCHandle.Alloc(myFunc) '//为委托建立句柄,以免它被垃圾回收,导致出错
'*==========================================================

End Sub
...全文
114 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
renchuang 2010-01-27
  • 打赏
  • 举报
回复
随便看看的
清晨曦月 元老 2010-01-27
  • 打赏
  • 举报
回复
DllImport实在是比较复杂的一个事情,涉及到很多方面的知识,如果是C写的DLL那你有函数的头文件就好办了。。。。如果不是可以挨个替换测试一下,如果不行的话有示例程序吧。。。拿来OD他。。。瞅瞅。。。反正是比较麻烦的事儿,你还不如让厂家提供支持VB.NET的代码了。
xiaobeibei626 2010-01-22
  • 打赏
  • 举报
回复
是的,函数是厂家直接提供给我们的,我也怀疑应该是byref传参,我想问下,VB.NET中DLL的参数调用方式有哪几种,我看了下DllImport,一头雾水,请各位大哥们给我实例看看
清晨曦月 元老 2010-01-22
  • 打赏
  • 举报
回复
1、真的是AS LONG吗,LONG在VS中是64位的,INTEGER是32位的
2、查看一下是否应该用BYREF来声明GDW_VPDCommDll的参数
感觉后者可能性比较大。

Private Function GDW_init() As Int16 '高德威车牌识别
Dim uiDataMsgNo As Long = 1025
Dim uiReConnectMsg As Long = 1026
Dim uiDisconnectMsg As Long = 1027
If GDW_Connect(Me.Handle.ToInt32, uiDataMsgNo, uiReConnectMsg, uiDisconnectMsg) = 0 Then
Return 0
Else
Return 1
End If
End Function
是不是很繁琐啊。。。
这几个作为常数吧 ?
Dim uiDataMsgNo As Long = 1025
Dim uiReConnectMsg As Long = 1026
Dim uiDisconnectMsg As Long = 1027

函数也没必要那么长,做一个隐式转换就可以了,你返回0,1而不带有INT16的说明符同样也是要经过隐式转换的
Private Function GDW_init() As Int16 '高德威车牌识别
Return GDW_Connect(Me.Handle.ToInt32, uiDataMsgNo, uiReConnectMsg, uiDisconnectMsg)
End Function

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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