2010-10-20 21 views
1

我最近把一個VB6程序轉換爲VB.NET。該程序用於與Superlogics PCM系列DAQ卡進行通信,該卡公司不再生產並且不支持VB.NET。我的程序在VB6中運行良好,但在VB.net中有問題,因爲外部.dll文件中的函數(我不確定)VB6到VB.NET的轉換問題,調用一個.dll函數的函數返回一個錯誤

我讀了很多論壇,並對編組屬性做了一些更改。所以,球員請給我你的想法來解決這個 -

錯誤

「我正在與IntStatus中= 350錯誤(指‘無效的要求,辦理’)

」的superlogics手冊只是要求我檢查PCMDigitalInputVB功能。請幫助我,在此先感謝

Public Function singleDigitalInput(ByVal LogicalDevice As Short, ByVal Channel As Short, ByRef InputValue As Byte) As Long 

    Dim intStatus As Short 
    Dim intRequestHandle As Short 
    Dim udtDigioRequest As New DigioRequest 
    udtDigioRequest.Initialize() 
    Dim udtDataBuffer As New PCMDriveBuffer 
    Dim udtAllocateRequest As New allocate_request 

    Dim lngRetChannelAdd As Integer 
    Dim lngRetBufferAdd As Integer 

    Dim blnCompleteStatus As Boolean 
    Dim lngEventMask As Integer 
    Dim ErrorCode As Short 

    On Error GoTo errUnknown 



    intRequestHandle = 0 
    blnCompleteStatus = False 

    '------------------------------------------------------------------- 
    'Allocate and lock memory for the Digital Input 
    '------------------------------------------------------------------- 

    With udtAllocateRequest 
     .request_type = DIGIN_TYPE_REQUEST 
     .channel_array_length = 1 
     .number_of_buffers = 1 
     .buffer_size = 1 
     .buffer_attributes = RING_BUFFER 
    End With 

    intStatus = PCMAllocateRequestVB(LogicalDevice, udtAllocateRequest) 

    If intStatus <> 0 Then 
     singleDigitalInput = intStatus 
     Exit Function 
    End If 

    'Debug.Print "Allocate Request Status = " & intStatus 

    '------------------------------------------------------------------- 
    'Prepare the Digital Input Request Structure 
    '------------------------------------------------------------------- 

    lngRetChannelAdd = PCMGetAddressOfVB(Channel) 
    'UPGRADE_WARNING: Couldn't resolve default property of object udtDataBuffer. Click for more: 'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="6A50421D-15FE-4896-8A1B-2EC21E9037B2"' 
    lngRetBufferAdd = PCMGetAddressOfVB(udtDataBuffer) 

    With udtDigioRequest 
     .ChannelArrayPtr = lngRetChannelAdd 
     .ArrayLength = 1 
     .DigioBufferptr = lngRetBufferAdd 
     .NumberOfScans = 1 
     .IOMode = ForegroundCPU 
     .TriggerSource = InternalTrigger 
     .ScanEventLevel = 0 
     .RequestStatus = NoEvents 
    End With 

    '------------------------------------------------------------------- 
    'Send a digital input request to the PCMDrive 

「我收到一個錯誤說‘無效的要求,辦理’與IntStatus中= 350

」的superlogics手冊要求我檢查PCMDigitalInputVB功能,僅此而已 '------------------------------------------------ -------------------

intStatus = PCMDigitalInputVB(LogicalDevice, udtDigioRequest, intRequestHandle) 


End Function 

'-----函數聲明'---------------

Declare Function PCMDigitalInputVB Lib "PCMDrvVB.DLL" (ByVal logical_device As Short, ByRef Request As DigioRequest, ByRef handle As Short) As Short 

'------------結構聲明------------------------------ -----------

Structure DigioRequest 
    Dim ChannelArrayPtr As Integer ' address of channel scan list 
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=3)> Dim ReservedArray0 As Short() ' reserved for future expansion 
    Dim ArrayLength As Short ' length of chan & gain arrays 
    Dim DigioBufferptr As Integer ' address of PCMDRIVE_buffer 
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=3)> Dim ReservedArray1 As Short() ' reserved for future expansion 
    Dim TriggerSource As Short ' trigger source 
    Dim TriggerMode As Short ' continuous/one-shot trigger 
    Dim TriggerSlope As Short ' rising/falling edge trigger 
    Dim TriggerChannel As Short ' trigger channel number 
    ' (analog or digital trigger) 
    Dim TriggerVoltage As Double ' trigger voltage (analog trigger) 
    Dim TriggerValue As Integer ' value for trigger (digital trigger) 
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=3)> Dim ReservedArray2 As Short() ' reserved for future expansion 
    Dim IOMode As Short ' input mode 
    ' = 0 poll 
    ' = 1 IRQ 
    ' = 2 DMA with CPU status 
    ' = 3 DMA with IRQ status 
    Dim ClockSource As Short ' clock source (0 = internal) 
    Dim ClockRate As Double ' clock rate (if not internal) 
    Dim SampleRate As Double ' input sampling rate (Hz) 
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=3)> Dim ReservedArray3 As Short() ' reserved for future expansion 
    Dim NumberOfScans As Integer ' number of channel scans 
    Dim ScanEventLevel As Integer ' generate event each scan_event_level 
    ' scans (0 = disable) 
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=7)> Dim ReservedArray4 As Short() ' reserved for future expansion 
    Dim TimeoutInterval As Short ' timeout interval (in sec) 
    Dim RequestStatus As Integer ' request event status 
    Public Sub Initialize() 
     ReDim ReservedArray0(3) 
     ReDim ReservedArray1(3) 
     ReDim ReservedArray2(3) 
     ReDim ReservedArray3(3) 
     ReDim ReservedArray4(7) 
    End Sub 
End Structure 

回答

1

由於VB6代碼工作正常的是,我只想轉換(套)相關的接口代碼在VB6類模塊,並創建一個COM組件(新建項目> VB6中的ActiveX DLL)。
生成的COM DLL可以使用COM Interop從.NET中調用。
另請參閱this SO question瞭解更多詳情。

+0

renick,感謝您的鏈接... pdf是有幫助的。但我的第一件事是安裝VS2008 b'coz pdf要求我創建ASP.NET應用程序,直到現在我還在使用VB 2008 Express版本。另外,你是否認爲我可以將VB6生成的DLL在一臺計算機上傳輸到另一臺計算機上,然後從那裏開始使用VB.NET? – Naveen

+0

是的,你可以在不同的計算機上構建dll。 – MarkJ

+0

COM Interop適用於任何類型的項目。我認爲它也適用於快遞版本。只要存在依賴關係(即VB6運行時和DAQ接口DLL),com DLL就可以在從2K/XP到Win7的任何Windows計算機上運行。如果你把它移動到另一臺機器上,你需要註冊它(谷歌:'regsvr32'),因爲它是一個COM DLL。 – renick

0

這看起來像一個pInvoke問題。這些可能非常令人沮喪。正如前面的評論者所說,只需將現有代碼封裝到VB6 COM組件中並從您的dotNet項目中調用該組件即可。

但是,它也應該可以從dotNet上實現。有一點要記住垃圾收集器。任何變量(包括UDT /結構體)都可以隨時由垃圾回收器在內存中移動。通常,這將表現爲應用程序有時工作,但不是其他時間。

如果每次都發生錯誤,請仔細檢查您的API調用的pInvoke聲明,並確保使用正確的數據類型和大小。還要確保你正確地傳遞參數byval/byref。

除此之外,如果不訪問API文檔或進行大量試錯,很難診斷這些問題。

+0

Zippit,現在我正在嘗試瞭解pInvoke問題。感謝領先 – Naveen

相關問題