none
如何在VB.NET使用OleLoadPicturePath RRS feed

  • 問題

  • 我想要把VB6的程式碼轉為VB.NET

    程式碼:

    Private Declare Function OleLoadPicturePath Lib "oleaut32.dll" (ByVal szURLorPath As Long, ByVal punkCaller As Long, ByVal dwReserved As Long, ByVal clrReserved As OLE_COLOR, ByRef riid As TGUID, ByRef ppvRet As IPicture) As Long
    
    Private Type TGUID
    Data1 As Long
    Data2 As Integer
    Data3 As Integer
    Data4(0 To 7) As Byte
    End Type
    
    
    Public Function LoadPicture(ByVal strFileName As String) As Picture
    Dim IID As TGUID
    With IID
    .Data1 = &H7BF80980
    .Data2 = &HBF32
    .Data3 = &H101A
    .Data4(0) = &H8B
    .Data4(1) = &HBB
    .Data4(2) = &H0
    .Data4(3) = &HAA
    .Data4(4) = &H0
    .Data4(5) = &H30
    .Data4(6) = &HC
    .Data4(7) = &HAB
    End With
    
    On Error GoTo LocalErr
    
    OleLoadPicturePath StrPtr(strFileName), 0&, 0&, 0&, IID, LoadPicture
    Exit Function
    LocalErr:
    Set LoadPicture = VB.LoadPicture(strFileName)
    Err.Clear
    End Function
    
    Private Sub Command1_Click()
    
    Dim b() As Byte
    Dim strURL As String
    
    Image1.Picture = LoadPicture("c:/csdn.jpg") 'Only JPG
    End Sub
    


    2019年11月9日 上午 07:22

解答

所有回覆

  • VB.NET程式碼:

    Public Class Form1
        Private Declare Function OleLoadPicturePath Lib "oleaut32.dll" (
                                 ByVal szURLorPath As String,
                                 ByVal punkCaller As Integer,
                                 ByVal dwReserved As Integer,
                                 ByVal clrReserved As System.Drawing.Color,
                                 ByRef riid As TGUID) As Integer
    
        Public Structure TGUID
            Dim Data1 As Integer
            Dim Data2 As Integer
            Dim Data3 As Integer
            Shared Data4() As Byte
        End Structure
    
    
        Public Function LoadPicture(ByVal strFileName As String)
            ReDim TGUID.Data4(7)
            Dim IID As TGUID
            With IID
                .Data1 = &H7BF80980
                .Data2 = &HBF32
                .Data3 = &H101A
                .Data4(0) = &H8B
                .Data4(1) = &HBB
                .Data4(2) = &H0
                .Data4(3) = &HAA
                .Data4(4) = &H0
                .Data4(5) = &H30
                .Data4(6) = &HC
                .Data4(7) = &HAB
            End With
    
    
            OleLoadPicturePath(strFileName, 0, 0, Color.Transparent, IID)
            Exit Function
        End Function
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            PictureBox1.Image = LoadPicture("c:/csdn.jpg") 'Only JPG
        End Sub
    End Class

    VB.NET這邊我先移除了ByRef ppvRet As IPicture,VB.NET沒有找到適合的代替

    能編譯,但是執行時會在OleLoadPicturePath(strFileName, 0, 0, Color.Transparent, IID)跑出:

    System.Runtime.InteropServices.MarshalDirectiveException: '無法封送處理 'parameter #4': 無效的 Managed/Unmanaged 類型組合。'

    2019年11月9日 上午 07:26
  • .Net 本身把 OLE 支援拿掉了,不要強上了。

    其次是 .Net 的 Structure 跟傳統結構記憶體模型不同,最好用 Byte 陣列收,在一個個屬性自行映射比較保險,不然就要調 Pack 之類的選項,可以搜尋先前討論。

    你看起來只是要讀圖片,為什麼不直接用 Image.FromFile 來讀?


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2019年11月9日 上午 10:57
  • 您好,因為最近想學習API的各種用法,才會想要用OLE去讀圖片出來。

    既然這個API不能用,有沒有其他可以開圖片的API呢?

    2019年11月9日 上午 11:44
  • VB.NET的Image控制項能夠直接顯示圖形檔案的內容, 不需要依賴OleLoadPicturePath函式, 您只要這樣做即可:

    Image控制項變數.ImageLocation="圖形檔案名稱.jpg"

    2019年11月9日 上午 11:51
  • 官方範例就是

    PictureBox.Image = Image.FromFile(路徑)

    https://docs.microsoft.com/zh-tw/dotnet/framework/winforms/controls/how-to-set-pictures-at-run-time-windows-forms

    這個做法有資源鎖定問題,如果你有要開檔但不鎖定資源,既有討論有。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    • 已標示為解答 紅茶0323 2019年11月10日 上午 02:43
    2019年11月9日 下午 03:22