对于一些VB6工程代码来说,需要完成从VB到的转换,在转换过程中需要注意很多内容,利用的直接转换功能很少能完全成功,需要我们付出很大的努力。
下面的代码实现从其他应用程序中的ListView控件中异地获取文本内容,是从VB6的代码中转换而来,包括一些旧类型的转换和数据类型声明的变化。
view plaincopy to clipboardprint?
1OptionExplicitOn
2ModuleModule1
3PublicStructureLV_ITEMA
4DimmaskAsInteger
5DimiItemAsInteger
6DimiSubItemAsInteger
7DimstateAsInteger
8DimstateMaskAsInteger
9DimpszTextAsInteger
10DimcchTextMaxAsInteger
11DimiImageAsInteger
12DimlParamAsInteger
13DimiIndentAsInteger
14EndStructure
15'Constants
16PrivateConstLVFI_PARAM=1
17PrivateConstLVM_FIRST=&H1000
18PrivateConstLVM_FINDITEM=LVM_FIRST+13
19PrivateConstLVM_GETITEMTEXT=LVM_FIRST+45
20PrivateConstLVM_SORTITEMS=LVM_FIRST+48
21PrivateConstLVM_GETHEADER=LVM_FIRST+31
22PrivateConstLVM_GETITEMCOUNT=(LVM_FIRST+4)
23PrivateConstHDM_FIRST=&H1200'//Headermessages
24PrivateConstHDM_GETITEMCOUNT=(HDM_FIRST+0)
25PrivateConstHDM_ORDERTOINDEX=(HDM_FIRST+15)
26PrivateConstPROCESS_QUERY_INFORMATION=1024
27PrivateConstPROCESS_VM_OPERATION=&H8
28PrivateConstPROCESS_VM_READ=&H10
29PrivateConstPROCESS_VM_WRITE=&H20
30PrivateConstPROCESS_ALL_ACCESSAsLong=&H1F0FFF
31PrivateConstSTANDARD_RIGHTS_REQUIRED=&HF0000
32PrivateConstMAX_LVMSTRINGAsInteger=255'可根椐读取数据长度设置适当的数值
33PrivateConstMEM_COMMIT=&H1000
34PrivateConstMEM_RELEASE=&H8000
35PrivateConstPAGE_READWRITE=&H4
36PrivateConstLVIF_TEXTAsInteger=&H1
37'APIdeclarations
38PrivateDeclareFunctionCloseHandleLib"kernel32"(ByValhObjectAsInteger)AsInteger
39PrivateDeclareFunctionReadProcessMemoryLib"kernel32"(ByValhProcessAsInteger,ByVallpBaseAddressAsInteger,ByReflpBufferAsByte,ByValnSizeAsInteger,ByVallpNumberOfBytesWrittenAsInteger)AsInteger
40PrivateDeclareFunctionVirtualFreeExLib"kernel32"(ByValhProcessAsInteger,ByVallpAddressAsInteger,ByValdwSizeAsInteger,ByValdwFreeTypeAsInteger)AsInteger
41PrivateDeclareFunctionWriteProcessMemoryLib"kernel32"(ByValhProcessAsInteger,ByVallpBaseAddressAsInteger,ByReflpBufferAsLV_ITEMA,ByValnSizeAsInteger,ByVallpNumberOfBytesWrittenAsInteger)AsInteger
42PrivateDeclareFunctionVirtualAllocExLib"kernel32"(ByValhProcessAsInteger,ByVallpAddressAsInteger,ByValdwSizeAsInteger,ByValflAllocationTypeAsInteger,ByValflProtectAsInteger)AsInteger
43PrivateDeclareFunctionOpenProcessLib"kernel32"(ByValdwDesiredAccessAsInteger,ByValbInheritHandleAsInteger,ByValdwProcIdAsInteger)AsInteger
44PrivateDeclareFunctionGetWindowThreadProcessIdLib"user32"(ByValhwndAsInteger,ByReflpdwProcessIdAsInteger)AsInteger
45PrivateDeclareFunctionSendMessageLib"user32"Alias"SendMessageA"(ByValhwndAsInteger,ByValwMsgAsInteger,ByValwParamAsInteger,ByVallParamAsInteger)AsInteger
46PublicFunctionGetListviewItem(ByValhWindowAsInteger,ByValProcessIDAsInteger,ByValpColumnAsInteger,ByValpRowAsInteger)AsString
47DimResultAsInteger
48DimmyItemAsLV_ITEMA
49DimpHandleAsInteger
50DimpStrBufferMemoryAsInteger
51DimpMyItemMemoryAsInteger
52DimstrBuffer()AsByte
53DimIndexAsInteger
54DimtmpStringAsString
55DimstrLengthAsInteger
56'******************************
57'为动态数组变量重新分配存储空间
58'******************************
59ReDimstrBuffer(MAX_LVMSTRING)
60'*****************************************************************************************************
61'打开一个现有进程的句柄,返回值Long,如执行成功,返回进程句柄;零表示失败。会设置GetLastError
62'PublicDeclareFunctionOpenProcessLib"kernel32"(ByValdwDesiredAccessAsLong,ByValbInheritHandleAsLong,ByValdwProcIdAsLong)AsLong
63'参数类型及说明
64'dwDesiredAccessLong,指定这个句柄要求的访问方法。指定API32.TXT文件中以PROCESS_???开头的一个或多个常数
65'bInheritHandleLong,如句柄能够由子进程继承,则为TRUE
66'dwProcessIdLong,要打开那个进程的进程标识符
67'*****************************************************************************************************
68pHandle=OpenProcess(PROCESS_ALL_ACCESS,False,ProcessID)
69'*****************************************************************************************************
70'VirtualAllocEx(目标进程的句柄,0,内存区域的大小,分配类型,新分配内存的存取保护类型)返回所分配页面的基址
71'*****************************************************************************************************
72pStrBufferMemory=VirtualAllocEx(pHandle,0,MAX_LVMSTRING,MEM_COMMIT,PAGE_READWRITE)
73'*************************************************
74'初始化LV_ITEM结构
75'MyItem.iSubItem列的索引号
76'myItem.pszText数据内容(此处是一个分配的内存地址)
77'*************************************************
78myItem.mask=LVIF_TEXT
79myItem.iSubItem=pColumn
80myItem.pszText=pStrBufferMemory
hTextMax=MAX_LVMSTRING
82'***********************************************************
83'把这个结构写入远程进程process's存储量
84'WriteProcessMemory(目标进程的句柄,地址,写入的数据,字节数,0)
85'***********************************************************
86pMyItemMemory=VirtualAllocEx(pHandle,0,Len(myItem),MEM_COMMIT,PAGE_READWRITE)
87Result=WriteProcessMemory(pHandle,pMyItemMemory,(myItem),Len(myItem),0&)
88'********************************
89'发送消息,得到项目信息和写入内存
90'********************************
91strLength=SendMessage(hWindow,LVM_GETITEMTEXT,pRow,pMyItemMemory)
92Result=ReadProcessMemory(pHandle,pStrBufferMemory,strBuffer(0),MAX_LVMSTRING,0)
93tmpString=System.Text.Encoding.Default.GetString(strBuffer).Trim
94Result=ReadProcessMemory(pHandle,pMyItemMemory,myItem,Len(myItem),0)
95'****************************
96'释放分配的内存和关闭进程句柄
97'****************************
98Result=VirtualFreeEx(pHandle,pStrBufferMemory,0,MEM_RELEASE)
99Result=VirtualFreeEx(pHandle,pMyItemMemory,0,MEM_RELEASE)
100Result=CloseHandle(pHandle)
101IfLen(tmpString)>0ThenGetListviewItem=tmpString
102EndFunction
103EndModule
104OptionExplicitOn
105ModuleModule1
106PublicStructureLV_ITEMA
107DimmaskAsInteger
108DimiItemAsInteger
109DimiSubItemAsInteger
110DimstateAsInteger
111DimstateMaskAsInteger
112DimpszTextAsInteger
113DimcchTextMaxAsInteger
114DimiImageAsInteger
115DimlParamAsInteger
116DimiIndentAsInteger
117EndStructure
118'Constants
119PrivateConstLVFI_PARAM=1
120PrivateConstLVM_FIRST=&H1000
121PrivateConstLVM_FINDITEM=LVM_FIRST+13
122PrivateConstLVM_GETITEMTEXT=LVM_FIRST+45
123PrivateConstLVM_SORTITEMS=LVM_FIRST+48
124PrivateConstLVM_GETHEADER=LVM_FIRST+31
125PrivateConstLVM_GETITEMCOUNT=(LVM_FIRST+4)
126PrivateConstHDM_FIRST=&H1200'//Headermessages
127PrivateConstHDM_GETITEMCOUNT=(HDM_FIRST+0)
128PrivateConstHDM_ORDERTOINDEX=(HDM_FIRST+15)
129PrivateConstPROCESS_QUERY_INFORMATION=1024
130PrivateConstPROCESS_VM_OPERATION=&H8
131PrivateConstPROCESS_VM_READ=&H10
132PrivateConstPROCESS_VM_WRITE=&H20
133PrivateConstPROCESS_ALL_ACCESSAsLong=&H1F0FFF
134PrivateConstSTANDARD_RIGHTS_REQUIRED=&HF0000
135PrivateConstMAX_LVMSTRINGAsInteger=255'可根椐读取数据长度设置适当的数值
136PrivateConstMEM_COMMIT=&H1000
137PrivateConstMEM_RELEASE=&H8000
138PrivateConstPAGE_READWRITE=&H4
139PrivateConstLVIF_TEXTAsInteger=&H1
140'APIdeclarations
141PrivateDeclareFunctionCloseHandleLib"kernel32"(ByValhObjectAsInteger)AsInteger
142PrivateDeclareFunctionReadProcessMemoryLib"kernel32"(ByValhProcessAsInteger,ByVallpBaseAddressAsInteger,ByReflpBufferAsByte,ByValnSizeAsInteger,ByVallpNumberOfBytesWrittenAsInteger)AsInteger
143PrivateDeclareFunctionVirtualFreeExLib"kernel32"(ByValhProcessAsInteger,ByVallpAddressAsInteger,ByValdwSizeAsInteger,ByValdwFreeTypeAsInteger)AsInteger
144PrivateDeclareFunctionWriteProcessMemoryLib"kernel32"(ByValhProcessAsInteger,ByVallpBaseAddressAsInteger,ByReflpBufferAsLV_ITEMA,ByValnSizeAsInteger,ByVallpNumberOfBytesWrittenAsInteger)AsInteger
145PrivateDeclareFunctionVirtualAllocExLib"kernel32"(ByValhProcessAsInteger,ByVallpAddressAsInteger,ByValdwSizeAsInteger,ByValflAllocationTypeAsInteger,ByValflProtectAsInteger)AsInteger
146PrivateDeclareFunctionOpenProcessLib"kernel32"(ByValdwDesiredAccessAsInteger,ByValbInheritHandleAsInteger,ByValdwProcIdAsInteger)AsInteger
147PrivateDeclareFunctionGetWindowThreadProcessIdLib"user32"(ByValhwndAsInteger,ByReflpdwProcessIdAsInteger)AsInteger
148PrivateDeclareFunctionSendMessageLib"user32"Alias"SendMessageA"(ByValhwndAsInteger,ByValwMsgAsInteger,ByValwParamAsInteger,ByVallParamAsInteger)AsInteger
149PublicFunctionGetListviewItem(ByValhWindowAsInteger,ByValProcessIDAsInteger,ByValpColumnAsInteger,ByValpRowAsInteger)AsString
150DimResultAsInteger
151DimmyItemAsLV_ITEMA
152DimpHandleAsInteger
153DimpStrBufferMemoryAsInteger
154DimpMyItemMemoryAsInteger
155DimstrBuffer()AsByte
156DimIndexAsInteger
157DimtmpStringAsString
158DimstrLengthAsInteger
159'******************************
160'为动态数组变量重新分配存储空间
161'******************************
162ReDimstrBuffer(MAX_LVMSTRING)
163'*****************************************************************************************************
164'打开一个现有进程的句柄,返回值Long,如执行成功,返回进程句柄;零表示失败。会设置GetLastError
165'PublicDeclareFunctionOpenProcessLib"kernel32"(ByValdwDesiredAccessAsLong,ByValbInheritHandleAsLong,ByValdwProcIdAsLong)AsLong
166'参数类型及说明
167'dwDesiredAccessLong,指定这个句柄要求的访问方法。指定API32.TXT文件中以PROCESS_???开头的一个或多个常数
168'bInheritHandleLong,如句柄能够由子进程继承,则为TRUE
169'dwProcessIdLong,要打开那个进程的进程标识符
170'*****************************************************************************************************
171pHandle=OpenProcess(PROCESS_ALL_ACCESS,False,ProcessID)
172'*****************************************************************************************************
173'VirtualAllocEx(目标进程的句柄,0,内存区域的大小,分配类型,新分配内存的存取保护类型)返回所分配页面的基址
174'*****************************************************************************************************
175pStrBufferMemory=VirtualAllocEx(pHandle,0,MAX_LVMSTRING,MEM_COMMIT,PAGE_READWRITE)
176'*************************************************
177'初始化LV_ITEM结构
178'MyItem.iSubItem列的索引号
179'myItem.pszText数据内容(此处是一个分配的内存地址)
180'*************************************************
181myItem.mask=LVIF_TEXT
182myItem.iSubItem=pColumn
183myItem.pszText=pStrBufferMemory
hTextMax=MAX_LVMSTRING
185'***********************************************************
186'把这个结构写入远程进程process's存储量
187'WriteProcessMemory(目标进程的句柄,地址,写入的数据,字节数,0)
188'***********************************************************
189pMyItemMemory=VirtualAllocEx(pHandle,0,Len(myItem),MEM_COMMIT,PAGE_READWRITE)
190Result=WriteProcessMemory(pHandle,pMyItemMemory,(myItem),Len(myItem),0&)
191'********************************
192'发送消息,得到项目信息和写入内存
193'********************************
194strLength=SendMessage(hWindow,LVM_GETITEMTEXT,pRow,pMyItemMemory)
195Result=ReadProcessMemory(pHandle,pStrBufferMemory,strBuffer(0),MAX_LVMSTRING,0)
196tmpString=System.Text.Encoding.Default.GetString(strBuffer).Trim
197Result=ReadProcessMemory(pHandle,pMyItemMemory,myItem,Len(myItem),0)
198'****************************
199'释放分配的内存和关闭进程句柄
200'****************************
201Result=VirtualFreeEx(pHandle,pStrBufferMemory,0,MEM_RELEASE)
202Result=VirtualFreeEx(pHandle,pMyItemMemory,0,MEM_RELEASE)
203Result=CloseHandle(pHandle)
204IfLen(tmpString)>0ThenGetListviewItem=tmpString
205EndFunction
206EndModule
实现转换的过程其实就是一个按图索骥的过程,按照丰富的运行错误信息提示,一步步的来完成。