none
Visual Basic 轉移 Visual Studio Windows API "EnumDisplayDevices" 得到錯訊息 RRS feed

  • 一般討論

  •  

    Visual Basic 轉移 Visual Studio

     

    呼叫Windows API    EnumDisplayDevices

     

    Visual Basic 撰寫方式

    Private Declare Function EnumDisplayDevices Lib "user32" Alias "EnumDisplayDevicesA" ( Unused As Any, ByVal iDevNum As Long, lpDisplayDevice As DISPLAY_DEVICE, ByVal dwFlags As Long) As Boolean

     

    If EnumDisplayDevices(ByVal 0&, DeviceNum, DD, ByVal 0&) Then

    Else

    MsgBox "Can not read device name"

    End If

    *這方法是可行的,但是若要轉換成 Visual Studio 我卻得到"其他資訊: 嘗試讀取或寫入受保護的記憶體。這通常表示其他記憶體已損毀。"

     

    Visual Studio 撰寫方式

     Private Declare Function EnumDisplayDevices Lib "user32" Alias "EnumDisplayDevicesA" (ByVal Unused As String, ByVal iDevNum As UInteger, ByRef lpDisplayDevice As DISPLAY_DEVICE, ByVal dwFlags As UInteger) As Boolean

            If EnumDisplayDevices(Nothing, 0, DisplayDevice, Nothing) Then
            Else
                MsgBox("Can not read device name")
            End If

    程式執行 If EnumDisplayDevices   得到錯誤訊息:其他資訊: 嘗試讀取或寫入受保護的記憶體。這通常表示其他記憶體已損毀。
    我一直很困惑錯誤在何處,對於Windows API  Any 在於Visual Studio使用需要變更為String or Integer 不明白我該選擇哪一種方法

    • 已移動 璉璉Moderator 2010年7月10日 上午 03:46 (從:Visual Studio一般討論區(General))
    • 已變更類型 深海城堡 2010年7月21日 下午 04:15 問題已解決
    2010年7月7日 上午 05:37

所有回覆

  • Help on getting display resolutions [Resolved]

    http://www.vbforums.com/showthread.php?t=300988

    API to change resolution

    http://www.xtremevbtalk.com/showthread.php?t=190484

    Screen Members

    http://msdn.microsoft.com/en-us/library/system.windows.forms.screen_members.aspx

    參考以上,或使用Screen類別...

    2010年7月7日 上午 05:59
  • 線上手冊有如何呼叫 Windows API ,先翻一翻吧~

    比如說用 IntPtr.Zero

    但最大的問題在 Structure ,這部份看情況要改的東西很多。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年7月7日 下午 12:47
  • 移文至:

    Visual Basic


    T.L. Cheng
    2010年7月10日 上午 03:45
    版主
  • 我照本宣科寫了一次, 不會有錯誤的啊, 唯一有可能是你在粗體部份的結構沒宣告正確還是其它 ?

    Public Class Form1
        <StructLayout(LayoutKind.Sequential)> _
        Public Structure DISPLAY_DEVICE
            Public cb As Int32
            <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=32)> Public DeviceName As String
            <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=128)> Public DeviceString As String
            Public StateFlags As Int32
            <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=128)> Public DeviceID As String
            <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=128)> Public DeviceKey As String
        End Structure

        Private Declare Function EnumDisplayDevices Lib "user32" Alias "EnumDisplayDevicesA" (ByVal Unused As String, ByVal iDevNum As UInteger, ByRef lpDisplayDevice As DISPLAY_DEVICE, ByVal dwFlags As UInteger) As Boolean
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
          
        End Sub

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim DispDriver As New DISPLAY_DEVICE
            If EnumDisplayDevices(Nothing, 0, DispDriver, Nothing) Then

            Else
                MsgBox("Can not read device name")
            End If
        End Sub
    End Class

     


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2010年7月10日 下午 02:50
    版主
  • http://www.wretch.cc/album/show.php?i=deepseamoon&b=5&f=1104969998&p=0

    #錯誤訊息圖片#

     

    我使用了你的方法得到的錯誤訊息與我遇到的相同

     

    類型 'System.AccessViolationException' 的未處理例外狀況發生於 WindowsApplication1.exe

    其他資訊: 嘗試讀取或寫入受保護的記憶體。這通常表示其他記憶體已損毀。

     

    2010年7月13日 上午 03:31
  • 你貼的圖根本沒權限看不到.
    2010年7月20日 下午 06:36
  • 2010年7月21日 上午 02:06
  • 謝謝! 我的作業系統是 win XP 

    我意外的在我的朋友家執行成功了,但是他的作業系統是 Windows 7 。

    我想如果要使用Visual Studio 2008 ,我要將我的系統更換Windows 7 以減少錯誤。


    2010年7月21日 下午 04:15