今天在学习汇编的过程中遇到一个问题,本来想实现一个文件浏览器的功能,但是在一个地方卡主了一下午.
首先我建立了一个ComboBox和一个TreeView,ComboBox用来承载逻辑驱动器,TreeView用于承载文件夹
然后在WM_NOTIFY中捕获TreeView节点展开的事件,到此为止一切正常
但是当我想打印出节点文字的时候出现了问题
invoke MessageBox,hWinMain,[esi].itemNew.pszText,NULL,MB_OK
这里打印出来的总是乱码
一下附上代码,请各位帮忙看下问题到底出在哪里了.
资源文件
#define MANIFEST 24
#define IDD_DLG1 1000
#define IDC_CBO1 1001
#define IDC_TRV1 1002
#define IDC_LSV1 1003
#define IDR_XPMANIFEST1 1
#include "resource.h"
IDD_DLG1 DIALOGEX 6,6,585,306
CAPTION "diskcon"
FONT 8,"MS Sans Serif",0,0,0
STYLE WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|DS_CENTER
BEGIN
CONTROL "",IDC_CBO1,"ComboBox",WS_CHILDWINDOW|WS_VISIBLE|WS_TABSTOP|CBS_DROPDOWNLIST,3,6,204,12
CONTROL "",IDC_TRV1,"SysTreeView32",WS_CHILDWINDOW|WS_VISIBLE|WS_TABSTOP|TVS_LINESATROOT|TVS_HASLINES|TVS_HASBUTTONS,3,21,204,279,WS_EX_CLIENTEDGE
CONTROL "",IDC_LSV1,"SysListView32",WS_CHILDWINDOW|WS_VISIBLE|WS_TABSTOP,210,6,369,294,WS_EX_CLIENTEDGE
END
IDR_XPMANIFEST1 MANIFEST "xpmanifest.xml"
头文件
include windows.inc
include kernel32.inc
include user32.inc
include Comctl32.inc
include shell32.inc
includelib kernel32.lib
includelib user32.lib
includelib Comctl32.lib
includelib shell32.lib
IDD_DLG1 equ 1000
IDC_CBO1 equ 1001
IDC_TRV1 equ 1002
DlgProc PROTO :HWND,:UINT,:WPARAM,:LPARAM
_InitHeap PROTO
_InitDrivers PROTO
_DriverChange PROTO
_HasMoreDir PROTO :DWORD
.const
szAllFile db '*.*',0
szSubDir db '\*.*',0
szInsTemp db 'temp',0
szE db '展开',0
szC db '收起',0
.data?
hInstance dd ?
hWinMain dd ?
hHeap dd ?
dwTemp dd ?
代码文件
.386
.model flat, stdcall ;32 bit memory model
option casemap :none ;case sensitive
include diskcon.inc
.code
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke _InitHeap
mov hHeap,eax
invoke InitCommonControls
invoke DialogBoxParam,hInstance,IDD_DLG1,NULL,addr DlgProc,NULL
invoke ExitProcess,0
DlgProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
local @item:TVITEM
.if uMsg == WM_INITDIALOG
push hWin
pop hWinMain
invoke _InitDrivers
invoke _DriverChange
.elseif uMsg == WM_COMMAND
mov eax,wParam
.if ax == IDC_CBO1
shr eax,16
.if ax == CBN_SELCHANGE
invoke _DriverChange
.endif
.endif
.elseif uMsg == WM_NOTIFY
mov esi,lParam
assume esi:ptr NMHDR
.if [esi].idFrom == IDC_TRV1
.if [esi].code == TVN_ITEMEXPANDING
assume esi:ptr NMTREEVIEW
invoke MessageBox,hWinMain,[esi].itemNew.pszText,NULL,MB_OK
.if [esi].action == TVE_EXPAND
;invoke MessageBox,hWinMain,offset szE,NULL,MB_OK
.elseif [esi].action == TVE_COLLAPSE
;invoke MessageBox,hWinMain,offset szC,NULL,MB_OK
.endif