| |
Visual-Basic EinsteigerCopyMemory (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 | |
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. | |
Re: CopyMemory (RTLMoveMemory) von vb6 nach vb.net aktualisieren | | | Autor: Move | Datum: 17.10.16 16:58 |
| Hallo Manfred,
geht das auch mit Strukturen ? | |
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 | |
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 ? | |
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 | |
| 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 |
|
|
Neu! sevCommand 4.0
Professionelle Schaltflächen im modernen Design!
Mit nur wenigen Mausklicks statten auch Sie Ihre Anwendungen ab sofort mit grafischen Schaltflächen im modernen Look & Feel aus (WinXP, Office, Vista oder auch Windows 8), inkl. große Symbolbibliothek. Weitere InfosTipp des Monats Access-Tools Vol.1
Über 400 MByte Inhalt
Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB
Nur 24,95 EURWeitere Infos
|