Frage zur korrekten Verwendung von RtlMoveMemory

19/09/2011 - 14:40 von Dieter Strassner | Report spam
Hallo NG'ler

befördere mit dieser Funktion einen gültigen RTF-Text (ca. 10 MB) in die
Zwischenablage

Private Declare Function GlobalLock& Lib "kernel32" (ByVal hMem&)
Private Declare Function GlobalUnlock& Lib "kernel32" (ByVal hMem&)
Private Declare Sub RtlMoveMemory Lib "kernel32" (Dst As Any, Src As Any,
ByVal Bytes&)

Dim hGlb As Long, lpDst As Long

hGlb = GlobalAlloc(GMEM_MOVEABLE, Len(S) + 1) ' Gibt Adresse zurück
lpDst = GlobalLock(hGlb)
RtlMoveMemory ByVal lpDst, ByVal S, Len(S) + 1
GlobalUnlock hGlb
If SetClipboardData(49290, hGlb) = 0 Then ' 49290 = RTF-Text
' Abfrage bringt 0 := Fehlerhafte Ausführung Error -2147221504
(80040000) "Ungültige OLEVERB-Struktur"
End If

Bei einigen wiederholbaren RTF-Texten bringt mir 'SetClipboardData' jedoch
0 als Rückgabe, also einen Fehler.
Kopiere ich den gleichen RTF-Text in die VB eigene Zwischenbalge,
funktioniert es.

Ich vermute es liegt an dem Befehl
RtlMoveMemory ByVal lpDst, ByVal S, Len(S) + 1
Ich verstehe hier jedoch nicht, was das Problem verursacht.
In einigen Beispielen die ich gefunden habe, wird mal ein CHR$(0) dran
gehangen, dann auch mal nicht, dann wieder gleich 10 davon.

Reicht denn ein Zeichen als "Reverve"? Oder ist das dann gleich ein CHR$(0),
da das letzte Byte nicht befüllt wird, jedoch intern normiert?

Kann mir da jemand weiterhelfen? Danke!

Viele Grüße - Dieter

EDV-Kommunikation Strassner e.K.
68623 Lampertheim
Internet: www.strassner.biz
 

Lesen sie die antworten

#1 W. Wolf
19/09/2011 - 17:35 | Warnen spam
Hallo Dieter,

"Dieter Strassner" schrieb




Nur eine Idee (ungeprüft): Versuche mal LenB(S) + 2

also in etwa so:

hGlb = GlobalAlloc(GMEM_MOVEABLE, LenB(S) + 2) ' Gibt Adresse zurück
lpDst = GlobalLock(hGlb)
RtlMoveMemory ByVal lpDst, StrPtr(S), LenB(S) + 2


Schönen Gruß
W. Wolf

Ähnliche fragen