vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
sevAniGif - als kostenlose Vollversion auf unserer vb@rchiv CD Vol.5  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

Visual-Basic Einsteiger
CopyMemory (RTLMoveMemory) von vb6 nach vb.net aktualisieren 
Autor: Move
Datum: 16.10.16 15:32

Hallo,

ich möchte gerne folgenden VB6 Code nach VB.NET (Visual Basic 2008) aktualisieren:

Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByRef _
  hpvDest As Any, ByRef hpvSource As Any, ByVal cbCopy As Integer)
Mal abgesehen davon, dass VB.NET den Datentyp Any nicht auflösen kann, stehe ich vor dem Problem, dass ich eine DruckerAPI in VB6 habe, die nun leider ein sehr zentraler Bestandteil unseres doch recht umfangreichen (und auch älteren) VB6 Projekts ist.

Public Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Integer, _
  ByVal dwBytes As Integer) As Integer
 
Public Function GetPrinter(ByRef frmOwner As System.Windows.Forms.Form, _
  Optional ByRef PrintFlags As Short = 0) As Printer
 
Dim PrintDlg As New PRINTDLG_TYPE
Dim DevMode As New DEVMODE_TYPE
Dim DevName As New DEVNAMES_TYPE
 
Dim lpDevMode, lpDevName As Integer
 
...
 
 DevMode.dmDeviceName = Printer.DeviceName
 DevMode.dmSize = Len(DevMode)
 DevMode.dmFields = DM_ORIENTATION Or DM_DUPLEX
 DevMode.dmOrientation = Printer.Orientation
 
PrintDlg.hDevMode = GlobalAlloc(GMEM_MOVEABLE Or GMEM_ZEROINIT, Len(DevMode))
lpDevMode = GlobalLock(PrintDlg.hDevMode)
 
If lpDevMode > 0 Then
 
   CopyMemory(lpDevMode, DevMode, Len(DevMode))
   bReturn = GlobalUnlock(PrintDlg.hDevMode)	
 
End If
 
 
...
Ich habe diesen Fremdcode aus dieser Api allerdings auch nicht so ganz verstanden, um ehrlich zu sein. CopyMemory scheint da wohl Pointer auf Speicheradressen zu "verschieben".

Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByRef _
  hpvDest As Object, ByRef hpvSource As Object, ByVal cbCopy As Integer)
funktioniert auch leider nicht-VB stürzt dann wohl ab.

Problem ist, dass ich da keine Structures übergeben kann.

Auch wenn man CopyMemory überlädt in etwa wie z.B.

Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByRef _
  hpvDest As Object, ByRef hpvSource As _beliebigeStruktur, ByVal cbCopy As _
  Integer)
oder umgekehrt

Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByRef _
  hpvDest As _beliebigeStruktur, ByRef hpvSource As Object, ByVal cbCopy As _
  Integer)
hängt sich der Compiler auf.

Hat da jemand eine Idee vielleicht, wie man da sonst die ComDlg32 unter .NET nutzen bzw. CopyMemory zum Laufen bringen kann ?

Viele Grüße und herzlichen Dank im Voraus,
Stephan
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: CopyMemory (RTLMoveMemory) von vb6 nach vb.net aktualisieren 
Autor: Manfred X
Datum: 17.10.16 15:26

Hallo!

Das Drucken erfolgt in VB.Net über die entsprechenden Framework-Klassen.
Ich empfehle eine Neuprogrammierung der Druckroutinen.

Die Signatur von RTLMoveMemory in VB.Net (laut PINVOKE.Net):
Declare Auto Sub MoveMemory Lib "Kernel32.dll" _
    Alias "RtlMoveMemory" (ByVal dest As IntPtr, ByVal src As IntPtr, ByVal _
    size As Integer)
Als "managed"-Alternative wird "Marshal.Copy" vorgeschlagen.

Übrigens:
Diese Funktion verschiebt eine Anzahl (3.Parameter) von Bytes im Haupspeicher von einer
Quelladresse zu einer Zieladresse, wobei eine Überlappung von Quell- und Zielbereich
zulässig ist.

Beitrag wurde zuletzt am 17.10.16 um 15:32:57 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: CopyMemory (RTLMoveMemory) von vb6 nach vb.net aktualisieren 
Autor: Move
Datum: 17.10.16 16:58

Hallo Manfred,

geht das auch mit Strukturen ?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: CopyMemory (RTLMoveMemory) von vb6 nach vb.net aktualisieren 
Autor: Manfred X
Datum: 17.10.16 19:51

Hallo!

Im Prinzip sollte das möglich sein, wenn die
Structure in VB.Net ein sequentielles Layout besitzt.
Beispiel

Ich würde aber Marshal.Copy verwenden.
Beispiel
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: CopyMemory (RTLMoveMemory) von vb6 nach vb.net aktualisieren 
Autor: Move
Datum: 18.10.16 11:08

Hallo Manfred,

habe das jetzt etwas umgeschrieben. So kann ich die Funktion CopyMemory vermeiden:


Public Function GetPrinter(ByRef frmOwner As System.Windows.Forms.Form, _
  Optional ByRef PrintFlags As Short = 0) As Printer
        Dim Printer As Printer
        Dim prnDialog As PrintDialog
        Dim prnDocument As PrintDocument
        Dim objPrinter As Printer
 
        Cursor.Current = Cursors.WaitCursor
 
        Printer = Nothing
        prnDialog = New PrintDialog
        prnDocument = New PrintDocument
        ' PrintDocument brauchen wir, um an die Eigenschaften von PrintDialog 
        ' zu kommen 
        prnDialog.Document = prnDocument
 
        If prnDialog.ShowDialog(frmOwner) = Windows.Forms.DialogResult.OK Then
            If prnDialog.PrinterSettings.PrinterName <> "" Then
 
                For Each objPrinter In Printers
                    '
                    ' Gehe alle verfügbaren Drucker durch
                    '
 
                    If objPrinter.DeviceName = _
                      prnDialog.PrinterSettings.PrinterName Then
 
                        Printer = New Printer
                        Printer = objPrinter
                        prnDocument = prnDialog.Document
 
                        Exit For
 
                    Else
 
                        Printer = Nothing
 
                    End If
 
 
                Next
 
            End If
            If Not Printer Is Nothing Then
 
                ' Eigentlich sollten dann auch die Eigenschaften des 
                ' Printer-Objekts
                ' mit den ausgewählten Einstellungen im PrinterDialog 
                ' übereinstimmen
 
                ueDeviceName = Printer.DeviceName
 
                uePaperBin = _
                  prnDocument.DefaultPageSettings.PaperSource.SourceName
 
                Printer.PaperBin = CShort( _
                  prnDocument.DefaultPageSettings.PaperSource.RawKind)
 
                ueCopies = CStr(prnDocument.PrinterSettings.Copies)
 
                Printer.Copies = prnDocument.PrinterSettings.Copies
 
                '1: Keiner
                '2: Duplex
 
                ueDuplex = CStr(IIf(prnDocument.PrinterSettings.Duplex > 1, _
                  "Duplex", "Einfach"))
                Printer.Duplex = prnDocument.PrinterSettings.Duplex
 
                ueOrientation = resolvePRNPapierausrichtung( _
                  prnDocument.DefaultPageSettings.Landscape)
                Printer.Orientation = IIf(Not _
                prnDocument.DefaultPageSettings.Landscape, vbPRORPortrait, _
                vbPRORLandscape)
                ueQuality = resolvePRNQualitaet( _
                prnDocument.DefaultPageSettings.PrinterResolution.Kind)
                Printer.PrintQuality = _
                prnDocument.DefaultPageSettings.PrinterResolution.Kind
 
            End If
 
 
 
 
        Else
 
            Printer = Nothing
 
 
        End If
 
        prnDialog.Dispose()
        prnDocument.Dispose()
        prnDocument = Nothing
        prnDialog = Nothing
 
        Cursor.Current = Cursors.Default
 
        Return Printer
    End Function
Was denkst du darüber ?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

CopyMemory geht auch unter .Net 
Autor: VB3-Guru
Datum: 02.11.16 13:05

Es gibt ja unter VB6 sehr viel Code, in dem Copymemory eingesetzt wird und Copymemory kann man auch unter .Net verwenden. Man muss jedoch den zu kopierenden Speicherbereich "pinnen", was gleichbedeutend ist zu Alloc und GlobalLock.

Hier gibt es ein Beispiel und einges an Diskussion dazu:
http://foren.activevb.de/forum/csharp/thread-2052/beitrag-2082/VB6-Code-003-WAV-mittels-Copyme/
Da geht es allerdings um RAW-Audio (Code ist teils in C# und teils in VB.Net), aber das Prinzip ist das gleiche.

LG Vb3-Guru
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel