Hallo Leute,
ich habe es endlich. Ich habe das Problem auch im activeVB Forum gepostet,
da hat mir jemanden den entscheidenden Tip gegeben, pszText als Long zu
deklarieren und ihm den Pointer auf den Shared Memory zuzuweisen. Dann
braucht man noch einen zweiten shared memory. Und das beste ist, dass ich noch
jemanden gefunden habe, der mir erklärt hat, wie man das unter Win9x/ME zum
Laufen bringt. Hier ist meine funktionierende Funktion (ohne Deklarationen bis auf
LV_ITEM und der neue Pointer LV_TEXT. Das Shared Memory zeugs siehe meinen
ersten Post), wenns jemanden interressiert. Ist jetzt getestet unter Win95B, Win98SE,
Win2kSP4 und WinXPSP1.
Option Explicit
Private Type LV_ITEM
mask As Long
iItem As Long
iSubItem As Long
state As Long
stateMask As Long
lpszText As Long 'HIER IST DER KNACKPUNKT!!
cchTextMax As Long
iImage As Long
lParam As Long
iIndent As Long
End Type
Private Type LV_TEXT
sItemText As String * 80
End Type
Private Const LVM_FIRST = &H1000
Private Const LVM_GETITEMTEXTA As Long = (LVM_FIRST + 45)
Private Const LVM_GETITEMW = (LVM_FIRST + 75)
Private Const LVIF_TEXT As Long = &H1
Public Function GetLVWLabel(lHwnD As Long, lNum As Long) As String
Dim pid As Long, tid As Long
Dim hProcess As Long
Dim lpSysSharedA As Long, dwSizeI As Long
Dim lpSysSharedB As Long, dwSizeT As Long
Dim hFileMappingA As Long
Dim hFileMappingB As Long
Dim lWritten As Long
Dim LV As LV_ITEM
Dim LT As LV_TEXT
LV.cchTextMax = 80
dwSizeI = Len(LV)
dwSizeT = Len(LT)
tid = GetWindowThreadProcessId(lHwnD, pid)
If IsWindowsNT Then
lpSysSharedA = GetMemSharedNT(pid, dwSizeI, hProcess)
lpSysSharedB = GetMemSharedNT(pid, dwSizeT, hProcess)
With LV
.mask = LVIF_TEXT
.lpszText = lpSysSharedB
.cchTextMax = 80
.iItem = lNum
End With
WriteProcessMemory hProcess, ByVal lpSysSharedA, LV, dwSizeI, _
lWritten
WriteProcessMemory hProcess, ByVal lpSysSharedB, LT, dwSizeT, _
lWritten
SendMessage lHwnD, LVM_GETITEMW, 0, ByVal lpSysSharedA
ReadProcessMemory hProcess, ByVal lpSysSharedB, LT, dwSizeT, _
lWritten
GetLVWLabel = TrimNull(StrConv(LT.sItemText, vbFromUnicode))
FreeMemSharedNT hProcess, lpSysSharedA, dwSizeI
FreeMemSharedNT hProcess, lpSysSharedB, dwSizeT
Else
lpSysSharedA = GetMemShared95(dwSizeI, hFileMappingA)
lpSysSharedB = GetMemShared95(dwSizeT, hFileMappingB)
LV.lpszText = lpSysSharedB
CopyMemory ByVal lpSysSharedA, LV, dwSizeI
CopyMemory ByVal lpSysSharedB, LT, dwSizeT
SendMessage lHwnD, LVM_GETITEMTEXTA, lNum, ByVal lpSysSharedA
CopyMemory LT, ByVal lpSysSharedB, dwSizeT
GetLVWLabel = TrimNull(LT.sItemText)
FreeMemShared95 hFileMappingA, lpSysSharedA
FreeMemShared95 hFileMappingB, lpSysSharedB
End If
End Function Vielen Dank für eure Bemühungen!
Gruß,
planetULTRA
For VB Tools visit :: www.planetultra.de :: |