Hallo Community,
Ich Programmiere zurzeit eine Excel-Anwendung in VB.NET. Darin ist eine Office-Zwischenablage-Funktion enthalten.
Den zugehörigen VBA Code, den ich in Internet (stackoverflow.com/questions/64931911/how-to-empty-clipboard) gefunden und modifiziert habe, in mein Programm übertragen und z.T abgeändert.
Hier ist mein modifizierter Vba-Code:
Übrigens der Code funktioniert einwandfrei unter Excel 2016 und Excel 2019 32bit + 64bit -Version.
Nun zum VB.NET:
In Visual Basic habe ich ein neues "Windows Forms-Anwendung Projekt" erstellt, um den in VB.NET übersetzten Code zu testen.
Form1 mit Zwei Buttons, Button1 schließt die Anwendung, Button2 führt die Sub HClearOfficeClipBoard(), die in Modul1 integriert ist aus.
Hier ist der VB.NET-Code:
Wenn ich die Sub ausführe, erhalte ich stets den Fehler:
PInvokeStackImbalance wurde erkannt.
Message: Ein Aufruf an die PInvoke-Funktion "WindowsApplication2!WindowsApplication1.Module1::AccessibleChildren" hat das Gleichgewicht des Stapels gestört.
Wahrscheinlich stimmt die verwaltete PInvoke-Signatur nicht mit der nicht verwalteten Zielsignatur überein.
Überprüfen Sie, ob die Aufrufkonvention und die Parameter der PInvoke-Signatur mit der nicht verwalteten Zielsignatur übereinstimmen.
Von dem, was ich in div. Foren gefunden habe, war leider nichts hilfreich.
Ich vermute, dass die Signatur von API-Funktion [AccessibleChildren Lib "oleacc.dll"] nicht stimmt.
Hat jemand eine Ahnung, wie ich den Fehler beseitigen kann?
Vielen Dank im Voraus für eure Bemühungen.
*Topic verschoben* - Marcus Gräfe
CodeTags korrigiert ~VaporiZed
Ich Programmiere zurzeit eine Excel-Anwendung in VB.NET. Darin ist eine Office-Zwischenablage-Funktion enthalten.
Den zugehörigen VBA Code, den ich in Internet (stackoverflow.com/questions/64931911/how-to-empty-clipboard) gefunden und modifiziert habe, in mein Programm übertragen und z.T abgeändert.
Hier ist mein modifizierter Vba-Code:
Visual Basic-Quellcode
- Option Explicit
- Option Compare Text
- #If VBA7 Then
- Private Declare PtrSafe Function AccessibleChildren Lib "oleacc" (ByVal paccContainer As Office.IAccessible, _
- ByVal iChildStart As Long, ByVal cChildren As Long, _
- ByRef rgvarChildren As Any, ByRef pcObtained As Long) As Long
- Public Const mVBA7 As Long = 1
- #Else
- Private Declare Function AccessibleChildren Lib "oleacc" (ByVal paccContainer As Office.IAccessible, _
- ByVal iChildStart As Long, ByVal cChildren As Long, _
- ByRef rgvarChildren As Any, ByRef pcObtained As Long) As Long
- Public Const mVBA7 As Long = 0
- #End If
- Public Sub HClearOfficeClipBoard()
- Dim cmnB As Variant, IsVis As Boolean, j As Long, Arr As Variant, Status As Variant
- Dim k As Long
- Dim objClipboard As Variant
- On Error GoTo ErrH
- objClipboard = Application.ClipboardFormats
- 'Wenn die Zwischenablage leer ist, wird alles unterbrochen.
- If objClipboard(1) = -1 Then
- MsgBox "Zwischenablage ist leer. Es gibt keine Elemente in der Zwischenablage zum Löschen", vbExclamation
- Set objClipboard = Nothing
- Exit Sub
- End If
- 'Zustand von Office-Zwischenablage feststellen
- Status = Application.DisplayClipboardWindow
- Arr = Array(4, 7, 2, 0) '4 und 2 für 32 bit, 7 und 0 für 64 bit
- Set cmnB = Application.CommandBars("Office Clipboard")
- IsVis = cmnB.Visible
- If Not IsVis Then
- cmnB.Visible = True
- DoEvents
- End If
- For j = 1 To Arr(0 + mVBA7)
- k = Choose(j, 0, 3, 0, 3, 0, 3, 1)
- Call AccessibleChildren(cmnB, k, 1, cmnB, 1)
- ' AccessibleChildren cmnB, Choose(j, 0, 3, 0, 3, 0, 3, 1), 1, cmnB, 1 'Alle löschen
- ' AccessibleChildren cmnB, Choose(j, 0, 3, 0, 3, 0, 3, 0), 1, cmnB, 1 'Alle einfügen
- Next
- cmnB.accDoDefaultAction CLng(Arr(2 + mVBA7))
- 'Fenster von Office-Zwischenablage wiederherstellen
- Application.CommandBars("Office Clipboard").Visible = IsVis
- MsgBox "Erfolreich abgeschlossen. Inhalt von Office-Zwischenablage ist gelöscht", vbOKOnly, "OFFICE-ZWISCHENABLAGE"
- ErrH:
- If Err > 0 Then
- MsgBox "Fehler beim Löschen " & Err.Description, vbOKOnly, "OFFICE-ZWISCHENABLAGE"
- 'Zustand von Office-Zwischenablage wiederherstellen
- With Application
- .DisplayClipboardWindow = Status
- End With
- End If
- Set cmnB = Nothing
- End Sub
Übrigens der Code funktioniert einwandfrei unter Excel 2016 und Excel 2019 32bit + 64bit -Version.
Nun zum VB.NET:
In Visual Basic habe ich ein neues "Windows Forms-Anwendung Projekt" erstellt, um den in VB.NET übersetzten Code zu testen.
Form1 mit Zwei Buttons, Button1 schließt die Anwendung, Button2 führt die Sub HClearOfficeClipBoard(), die in Modul1 integriert ist aus.
Hier ist der VB.NET-Code:
VB.NET-Quellcode
- Imports System.Runtime.InteropServices
- Imports Accessibility
- Imports Microsoft.Office.Interop.Excel
- Module Module1
- Public ExApp As Object = Nothing
- Private Declare Function AccessibleChildren Lib "oleacc.dll" (ByVal paccContainer As IAccessible, _
- ByVal iChildStart As Long, ByVal cChildren As Long, _
- ByVal rgvarChildren As Object, ByRef pcObtained As Long) As Long
- Public Const mVBA7 As Long = 1
- Public Sub HClearOfficeClipBoard()
- Dim cmnB As Object, IsVis As Boolean, j As Long, Arr() As Long
- Dim k As Long, objClipboard As Object
- ' Hiermit wird der Verweis auf Excel-Instanz ermöglicht
- If Is_Excel_Running() = False Then
- MsgBox("Excel ist nicht gestartet. Bitte starten Sie Excel und versuchen Sie erneut")
- Exit Sub
- End If
- objClipboard = ExApp.ClipboardFormats
- 'Wenn die Zwischenablage leer ist, wird alles unterbrochen.
- If objClipboard(1) = -1 Then
- MsgBox("Zwischenablage ist leer. Es gibt keine Elemente in der Zwischenablage zum Löschen", MsgBoxStyle.Exclamation)
- ReleaseExcelObject(objClipboard)
- Exit Sub
- End If
- Arr = {4, 7, 2, 0} '4 und 2 für 32 bit, 7 und 0 für 64 bit
- cmnB = ExApp.CommandBars("Office Clipboard")
- Try
- IsVis = cmnB.Visible
- If Not IsVis Then
- cmnB.Visible = True
- End If
- For j = 1 To Arr(0 + mVBA7)
- k = Choose(j, 0, 3, 0, 3, 0, 3, 1)
- AccessibleChildren(cmnB, k, 1, cmnB, 1) 'Diese Zeile verursacht Fehler
- Next
- cmnB.accDoDefaultAction(CLng(Arr(2 + mVBA7)))
- ExApp.CommandBars("Office Clipboard").Visible = IsVis
- Catch ex As Exception
- MsgBox("FEHLER: " & ex.ToString)
- Finally
- ReleaseExcelObject(cmnB)
- ReleaseExcelObject(objClipboard)
- ReleaseExcelObject(ExApp)
- End Try
- End Sub
- Private Function Is_Excel_Running() As Boolean
- Dim Result As Boolean = Nothing
- Try
- Dim P As Process() = Process.GetProcessesByName("EXCEL")
- Dim CountLength As Integer = P.Length
- If CountLength <> 0 Then
- 'Excel ist bereits gestartet wir hängen uns in Excel-Instanz.
- ExApp = CType(Marshal.GetActiveObject("Excel.Application"), Application)
- 'wenn excel sichtbar
- If ExApp.Visible Then
- Result = True
- Else
- Result = False
- End If
- End If
- Catch e As Exception
- If Not ExApp Is Nothing Then
- ExApp = Nothing
- End If
- Result = False
- End Try
- Return Result
- End Function
- Private Sub ReleaseExcelObject(ByVal sender As Object)
- If (Not (sender) Is Nothing) Then
- Try
- Do Until _
- Marshal.ReleaseComObject(sender) <= 0
- Loop
- Catch
- Finally
- sender = Nothing
- End Try
- End If
- End Sub
- End Module
Wenn ich die Sub ausführe, erhalte ich stets den Fehler:
PInvokeStackImbalance wurde erkannt.
Message: Ein Aufruf an die PInvoke-Funktion "WindowsApplication2!WindowsApplication1.Module1::AccessibleChildren" hat das Gleichgewicht des Stapels gestört.
Wahrscheinlich stimmt die verwaltete PInvoke-Signatur nicht mit der nicht verwalteten Zielsignatur überein.
Überprüfen Sie, ob die Aufrufkonvention und die Parameter der PInvoke-Signatur mit der nicht verwalteten Zielsignatur übereinstimmen.
Von dem, was ich in div. Foren gefunden habe, war leider nichts hilfreich.
Ich vermute, dass die Signatur von API-Funktion [AccessibleChildren Lib "oleacc.dll"] nicht stimmt.
Hat jemand eine Ahnung, wie ich den Fehler beseitigen kann?
Vielen Dank im Voraus für eure Bemühungen.
*Topic verschoben* - Marcus Gräfe
CodeTags korrigiert ~VaporiZed
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VaporiZed“ ()