本文介绍了vb.net紧凑框架pinvok到unmanaged,win32,dll问题!!的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

嗨!
$


我正在开发visual studio compact framework,vb.net上的一个项目。试图pinvoke一些外部win32 DLL文件。在大多数情况下,这不是问题。但已经停止了我无法解决的案件..



第一个问题是:



我正在尝试使用win32 dll函数,使用此签名:



DLLDIR long  WINAPI openCom(char * pComPort,长波特率,char * pVersion,int协议,int logLevel);



并且在vb.net中尝试了这个这个:



< DllImport(" NameOfDLLFile.dll",EntryPoint:=" openCom",SetLastError:= True,CharSet:= CharSet。自动)> _

  &NBSP;&NBSP; &NBSP;私人共享功能openCom(_

        ByVal comPort As StringBuilder,_

'EM>&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; BYVAL波特率作为的Int32,_

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;    ByVal版本作为StringBuilder,_

         ByVal protocol As Int32,_

         ByVal logLevel As Int32)As Int32

&NBSP; &NBSP;&NBSP;&NBSP; &NBSP;结束功能



功能:

Hi!

I am working on a project in visual studio compact framework, vb.net. Trying to pinvoke some external win32 dll files. In most of the cases it is not a problem. But have stopped on to cases I can't solve..

The first problem is:

I am trying to use the win32 dll function, with this signature:

DLLDIR long  WINAPI openCom(char* pComPort, long baudrate, char* pVersion, int protocol, int logLevel);

And have tried this in vb.net like this:

<DllImport("NameOfDLLFile.dll", EntryPoint:="openCom", SetLastError:=True, CharSet:=CharSet.Auto)> _
       Private Shared Function openCom( _
            ByVal comPort As StringBuilder, _
            ByVal baudrate As Int32, _
            ByVal version As StringBuilder, _
            ByVal protocol As Int32, _
            ByVal logLevel As Int32) As Int32
        End Function

function:

       &NBSP;&NBSP;&NBSP;&NBSP;&NBSP;昏暗的结果为长


            Dim Version As String =" myComp"

           昏暗COMPORT作为字符串=" 10.10.10.10"

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;暗淡ComPortBuild作为新的StringBuilder(COMPORT)

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; Dim VersionBuild As New StringBuilder(Version)



           ;&NBSP;结果= openCom(ComPortBuild,0,VersionBuild,3,1)



$
我总是得到错误,版本参数不被接受。

我知道这个参数必须是6个字符长。原样。所以我看不出我在这里做错了什么?

            Dim Result As Long
            Dim Version As String = "myComp"
            Dim comPort As String = "10.10.10.10"
            Dim ComPortBuild As New StringBuilder(comPort)
            Dim VersionBuild As New StringBuilder(Version)

            Result = openCom(ComPortBuild, 0, VersionBuild, 3, 1)


And I always get error, that says the Version parameter is not acceptet.
I know this paramter must be 6 char's long. As it is. So I can not see what I do wrong here?

 第二个问题是



 尝试将代表发送给非托管回拨函数。



 这是签名中的签名unmanaged dll file。



typedef void(CALLBACK * StatusCallback)(int statusType);

typedef void(CALLBACK * ReturnCallback)(void);

DLLDIR void  WINAPI setCallbackFuncs(StatusCallback statusFunc,ReturnCallback returnFunc);



这就是我在托管代码中所做的。



    <的DllImport(QUOT; NameOfDLLFile.dll" ;,在EntryPoint:=" setCallbackFuncs" ;, SetLastError:=真,字符集:= CharSet.Auto)GT; _

      公共共享功能setCallbackFuncs(BYVAL CallbackAddr作为StatusCallbackDel,BYVAL CallbackAddr2作为ReturnCallbackDel)

&NBSP;&NBSP;&NBSP;结束功能



    Public Delegate Function StatusCallbackDel(ByVal stausType As Int32)

   公共代表函数ReturnCallbackDel()



   公共共享功能StatusCallback(ByVal stausType为Int32)

   结束功能

   公共共享功能ReturnCallback()

   结束功能



   公共共享功能SetCallbacks_Point()



&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ; Dim Statusdel As StatusCallbackDel = New StatusCallbackDel(AddressOf StatusCallback)

            Dim Returndel As ReturnCallbackDel = New ReturnCallbackDel(AddressOf ReturnCallback)



         &NBSP;&NBSP;&NBSP; setCallbackFuncs(Statusdel,Returndel)



   结束功能



但是得到NotSupported execpetion!

不知道我错过了什么? 甚至可以从紧凑框架调用非托管回调吗?

 The second problem is

 Trying to send a delegate to a unmanaged callback function.

 This is the signature in the unmanaged dll file.

typedef void (CALLBACK *StatusCallback)(int statusType);
typedef void (CALLBACK *ReturnCallback)(void);
DLLDIR void  WINAPI setCallbackFuncs(StatusCallback statusFunc, ReturnCallback returnFunc);

And this i what i did in managed code.

    <DllImport("NameOfDLLFile.dll", EntryPoint:="setCallbackFuncs", SetLastError:=True, CharSet:=CharSet.Auto)> _
       Public Shared Function setCallbackFuncs(ByVal CallbackAddr As StatusCallbackDel, ByVal CallbackAddr2 As ReturnCallbackDel)
    End Function

    Public Delegate Function StatusCallbackDel(ByVal stausType As Int32)
    Public Delegate Function ReturnCallbackDel()

    Public Shared Function StatusCallback(ByVal stausType As Int32)
    End Function
    Public Shared Function ReturnCallback()
    End Function

    Public Shared Function SetCallbacks_Point()

            Dim Statusdel As StatusCallbackDel = New StatusCallbackDel(AddressOf StatusCallback)
            Dim Returndel As ReturnCallbackDel = New ReturnCallbackDel(AddressOf ReturnCallback)

            setCallbackFuncs(Statusdel, Returndel)

    End Function

But get the NotSupported execpetion !
Do not know what I missed here?  Is it even possible to call a unmanaged callback from compact framework?

最好的问候
$ b $bPålFredrik

Best Regards
Pål Fredrik

推荐答案


这篇关于vb.net紧凑框架pinvok到unmanaged,win32,dll问题!!的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-28 18:25