| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1885 人关注过本帖
标题:完成记事本功能的几个问题
只看楼主 加入收藏
wingyip
Rank: 1
等 级:新手上路
威 望:2
帖 子:119
专家分:0
注 册:2007-7-16
收藏
 问题点数:0 回复次数:6 
完成记事本功能的几个问题
请问怎么实现能够创建、打开、编辑和保存文件
这几个功能啊?
谢谢啊
搜索更多相关主题的帖子: 记事本 文件 保存 
2008-07-11 18:13
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
[bo][un]wingyip[/un] 在 2008-7-11 18:13 的发言:[/bo]

请问怎么实现能够创建、打开、编辑和保存文件
这几个功能啊?
谢谢啊


用windows里文件操作的几个api吧
2008-07-11 19:07
wingyip
Rank: 1
等 级:新手上路
威 望:2
帖 子:119
专家分:0
注 册:2007-7-16
收藏
得分:0 
什麽意思?
我們老師一定要我們用assembly語言來實現

2008-07-11 20:23
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
[bo][un]wingyip[/un] 在 2008-7-11 20:23 的发言:[/bo]

什麽意思?
我們老師一定要我們用assembly語言來實現


win32汇编的话  罗云彬的书里就有个例子

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Sample code for < Win32ASM Programming >
; by 罗云彬, http://asm.
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Richedit.asm
; “丰富编辑”控件的使用例子
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 使用 nmake 或下列命令进行编译和链接:
; ml /c /coff Richedit.asm
; rc Richedit.rc
; Link /subsystem:windows Richedit.obj Richedit.res
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .386
        .model flat, stdcall
        option casemap :none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include        windows.inc
include        user32.inc
includelib    user32.lib
include        kernel32.inc
includelib    kernel32.lib
include        comdlg32.inc
includelib    comdlg32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 等值定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN    equ    1000
IDA_MAIN    equ    2000
IDM_MAIN    equ    2000
IDM_OPEN    equ    2101
IDM_SAVE    equ    2102
IDM_EXIT    equ    2103
IDM_UNDO    equ    2201
IDM_REDO    equ    2202
IDM_SELALL    equ    2203
IDM_COPY    equ    2204
IDM_CUT        equ    2205
IDM_PASTE    equ    2206
IDM_FIND    equ    2207
IDM_FINDPREV    equ    2208
IDM_FINDNEXT    equ    2209
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .data?
hInstance    dd    ?
hWinMain    dd    ?
hMenu        dd    ?
hWinEdit    dd    ?
hFile        dd    ?
hFindDialog    dd    ?
idFindMessage    dd    ?
szFileName    db    MAX_PATH dup (?)
szFindText    db    100 dup (?)

        .data
stFind        FINDREPLACE <sizeof FINDREPLACE,0,0,FR_DOWN,szFindText,\
        0,sizeof szFindText,0,0,0,0>

        .const
FINDMSGSTRING    db    'commdlg_FindReplace',0
szClassName    db    'Wordpad',0
szCaptionMain    db    '记事本',0
szDllEdit    db    'RichEd20.dll',0
szClassEdit    db    'RichEdit20A',0
szNotFound    db    '字符串未找到!',0
szFilter    db    'Text Files(*.txt)',0,'*.txt',0
        db    'All Files(*.*)',0,'*.*',0,0
szDefaultExt    db    'txt',0
szErrOpenFile    db    '无法打开文件!',0
szModify    db    '文件已修改,是否保存?',0
szFont        db    '宋体',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

        .code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Richedit的流操作
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcStream    proc uses ebx edi esi _dwCookie,_lpBuffer,_dwBytes,_lpBytes

        .if    _dwCookie
            invoke    ReadFile,hFile,_lpBuffer,_dwBytes,_lpBytes,0
        .else
            invoke    WriteFile,hFile,_lpBuffer,_dwBytes,_lpBytes,0
        .endif
        xor    eax,eax
        ret

_ProcStream    endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 保存文件,如果没有打开或创建文件则调用“另存为”子程序
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_SaveFile    proc
        local    @stES:EDITSTREAM

        mov    @stES.dwCookie,FALSE
        mov    @stES.pfnCallback,offset _ProcStream
        invoke    SendMessage,hWinEdit,EM_STREAMOUT,SF_TEXT,addr @stES
        invoke    SendMessage,hWinEdit,EM_SETMODIFY,FALSE,0
        ret

_SaveFile    endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 打开及输入文件
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_OpenFile    proc
        local    @stOF:OPENFILENAME
        local    @stES:EDITSTREAM

;********************************************************************
; 显示“打开文件”对话框
;********************************************************************
        invoke    RtlZeroMemory,addr @stOF,sizeof @stOF
        mov    @stOF.lStructSize,sizeof @stOF
        push    hWinMain
        pop    @stOF.hwndOwner
        mov    @stOF.lpstrFilter,offset szFilter
        mov    @stOF.lpstrFile,offset szFileName
        mov    @stOF.nMaxFile,MAX_PATH
        mov    @stOF.Flags,OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST
        mov    @stOF.lpstrDefExt,offset szDefaultExt
        invoke    GetOpenFileName,addr @stOF
        .if    eax
;********************************************************************
; 创建文件
;********************************************************************
            invoke    CreateFile,addr szFileName,GENERIC_READ or GENERIC_WRITE,\
                FILE_SHARE_READ or FILE_SHARE_WRITE,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0
            .if    eax ==    INVALID_HANDLE_VALUE
                invoke    MessageBox,hWinMain,addr szErrOpenFile,NULL,MB_OK or MB_ICONSTOP
                ret
            .endif
            push    eax
            .if    hFile
                invoke    CloseHandle,hFile
            .endif
            pop    eax
            mov    hFile,eax
;********************************************************************
; 读入文件
;********************************************************************
            mov    @stES.dwCookie,TRUE
            mov    @stES.pfnCallback,offset _ProcStream
            invoke    SendMessage,hWinEdit,EM_STREAMIN,SF_TEXT,addr @stES
            invoke    SendMessage,hWinEdit,EM_SETMODIFY,FALSE,0
        .endif
        ret

_OpenFile    endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 允许继续操作则返回TRUE
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_CheckModify    proc
        local    @dwReturn

        mov    @dwReturn,TRUE
        invoke    SendMessage,hWinEdit,EM_GETMODIFY,0,0
        .if    eax && hFile
            invoke    MessageBox,hWinMain,addr szModify,addr szCaptionMain,\
                MB_YESNOCANCEL or MB_ICONQUESTION
            .if    eax ==    IDYES
                call    _SaveFile
            .elseif    eax ==    IDCANCEL
                mov    @dwReturn,FALSE
            .endif
        .endif
        mov    eax,@dwReturn
        ret

_CheckModify    endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 查找文字
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_FindText    proc
        local    @stFindText:FINDTEXTEX

;********************************************************************
; 设置查找范围
;********************************************************************
        invoke    SendMessage,hWinEdit,EM_EXGETSEL,0,addr @stFindText.chrg
        .if    stFind.Flags & FR_DOWN
            push    @stFindText.chrg.cpMax
            pop    @stFindText.chrg.cpMin
        .endif
        mov    @stFindText.chrg.cpMax,-1
;********************************************************************
; 设置查找选项
;********************************************************************
        mov    @stFindText.lpstrText,offset szFindText
        mov    ecx,stFind.Flags
        and    ecx,FR_MATCHCASE or FR_DOWN or FR_WHOLEWORD
;********************************************************************
; 查找并把光标设置到找到的文本上
;********************************************************************
        invoke    SendMessage,hWinEdit,EM_FINDTEXTEX,ecx,addr @stFindText
        .if    eax ==    -1
            mov    ecx,hWinMain
            .if    hFindDialog
                mov    ecx,hFindDialog
            .endif
            invoke    MessageBox,ecx,addr szNotFound,NULL,MB_OK or MB_ICONINFORMATION
            ret
        .endif
        invoke    SendMessage,hWinEdit,EM_EXSETSEL,0,addr @stFindText.chrgText
        invoke    SendMessage,hWinEdit,EM_SCROLLCARET,NULL,NULL
        ret

_FindText    endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 根据情况改变菜单项状态
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_SetStatus    proc
        local    @stRange:CHARRANGE

        invoke    SendMessage,hWinEdit,EM_EXGETSEL,0,addr @stRange
;********************************************************************
        mov    eax,@stRange.cpMin
        .if    eax ==    @stRange.cpMax
            invoke    EnableMenuItem,hMenu,IDM_COPY,MF_GRAYED
            invoke    EnableMenuItem,hMenu,IDM_CUT,MF_GRAYED
        .else
            invoke    EnableMenuItem,hMenu,IDM_COPY,MF_ENABLED
            invoke    EnableMenuItem,hMenu,IDM_CUT,MF_ENABLED
        .endif
;********************************************************************
        invoke    SendMessage,hWinEdit,EM_CANPASTE,0,0
        .if    eax
            invoke    EnableMenuItem,hMenu,IDM_PASTE,MF_ENABLED
        .else
            invoke    EnableMenuItem,hMenu,IDM_PASTE,MF_GRAYED
        .endif
;********************************************************************
        invoke    SendMessage,hWinEdit,EM_CANREDO,0,0
        .if    eax
            invoke    EnableMenuItem,hMenu,IDM_REDO,MF_ENABLED
        .else
            invoke    EnableMenuItem,hMenu,IDM_REDO,MF_GRAYED
        .endif
;********************************************************************
        invoke    SendMessage,hWinEdit,EM_CANUNDO,0,0
        .if    eax
            invoke    EnableMenuItem,hMenu,IDM_UNDO,MF_ENABLED
        .else
            invoke    EnableMenuItem,hMenu,IDM_UNDO,MF_GRAYED
        .endif
;********************************************************************
        invoke    GetWindowTextLength,hWinEdit
        .if    eax
            invoke    EnableMenuItem,hMenu,IDM_SELALL,MF_ENABLED
        .else
            invoke    EnableMenuItem,hMenu,IDM_SELALL,MF_GRAYED
        .endif
;********************************************************************
        invoke    SendMessage,hWinEdit,EM_GETMODIFY,0,0
        .if    eax && hFile
            invoke    EnableMenuItem,hMenu,IDM_SAVE,MF_ENABLED
        .else
            invoke    EnableMenuItem,hMenu,IDM_SAVE,MF_GRAYED
        .endif
;********************************************************************
        .if    szFindText
            invoke    EnableMenuItem,hMenu,IDM_FINDNEXT,MF_ENABLED
            invoke    EnableMenuItem,hMenu,IDM_FINDPREV,MF_ENABLED
        .else
            invoke    EnableMenuItem,hMenu,IDM_FINDNEXT,MF_GRAYED
            invoke    EnableMenuItem,hMenu,IDM_FINDPREV,MF_GRAYED
        .endif
;********************************************************************
        ret

_SetStatus    endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_Init        proc
        local    @stCf:CHARFORMAT

;********************************************************************
; 注册“查找”对话框消息,初始化“查找”对话框的结构
;********************************************************************
        push    hWinMain
        pop    stFind.hwndOwner
        invoke    RegisterWindowMessage,addr FINDMSGSTRING
        mov    idFindMessage,eax
;********************************************************************
; 建立输出文本窗口
;********************************************************************
        invoke    CreateWindowEx,WS_EX_CLIENTEDGE,offset szClassEdit,NULL,\
            WS_CHILD OR WS_VISIBLE OR WS_VSCROLL OR    WS_HSCROLL \
            OR ES_MULTILINE or ES_NOHIDESEL,\
            0,0,0,0,\
            hWinMain,0,hInstance,NULL
        mov    hWinEdit,eax

        invoke    SendMessage,hWinEdit,EM_SETTEXTMODE,TM_PLAINTEXT,0
        invoke    RtlZeroMemory,addr @stCf,sizeof @stCf
        mov    @stCf.cbSize,sizeof @stCf
        mov    @stCf.yHeight,9 * 20
        mov    @stCf.dwMask,CFM_FACE or CFM_SIZE or CFM_BOLD
        invoke    lstrcpy,addr @stCf.szFaceName,addr szFont
        invoke    SendMessage,hWinEdit,EM_SETCHARFORMAT,0,addr @stCf
        invoke    SendMessage,hWinEdit,EM_EXLIMITTEXT,0,-1
        ret

_Init        endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_Quit        proc

        invoke    _CheckModify
        .if    eax
            invoke    DestroyWindow,hWinMain
            invoke    PostQuitMessage,NULL
            .if    hFile
                invoke    CloseHandle,hFile
            .endif
        .endif
        ret

_Quit        endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcWinMain    proc    uses ebx edi esi hWnd,uMsg,wParam,lParam
        local    @stRange:CHARRANGE
        local    @stRect:RECT

        mov    eax,uMsg
        .if    eax ==    WM_SIZE
            invoke    GetClientRect,hWinMain,addr @stRect
            invoke    MoveWindow,hWinEdit,0,0,@stRect.right,@stRect.bottom,TRUE
;********************************************************************
; 处理菜单、加速键及工具栏消息
;********************************************************************
        .elseif    eax ==    WM_COMMAND
            mov    eax,wParam
            movzx    eax,ax
            .if    eax ==    IDM_OPEN
                invoke    _CheckModify
                .if    eax
                    call    _OpenFile
                .endif
            .elseif    eax ==    IDM_SAVE
                call    _SaveFile
            .elseif    eax ==    IDM_EXIT
                invoke    _Quit
            .elseif    eax ==    IDM_UNDO
                invoke    SendMessage,hWinEdit,EM_UNDO,0,0
            .elseif    eax ==    IDM_REDO
                invoke    SendMessage,hWinEdit,EM_REDO,0,0
            .elseif    eax ==    IDM_SELALL
                mov    @stRange.cpMin,0
                mov    @stRange.cpMax,-1
                invoke    SendMessage,hWinEdit,EM_EXSETSEL,0,addr @stRange
            .elseif    eax ==    IDM_COPY
                invoke    SendMessage,hWinEdit,WM_COPY,0,0
            .elseif    eax ==    IDM_CUT
                invoke    SendMessage,hWinEdit,WM_CUT,0,0
            .elseif    eax ==    IDM_PASTE
                invoke    SendMessage,hWinEdit,WM_PASTE,0,0
            .elseif    eax ==    IDM_FIND
                and    stFind.Flags,not FR_DIALOGTERM
                invoke    FindText,addr stFind
                .if    eax
                    mov    hFindDialog,eax
                .endif
            .elseif    eax ==    IDM_FINDPREV
                and    stFind.Flags,not FR_DOWN
                invoke    _FindText
            .elseif    eax ==    IDM_FINDNEXT
                or    stFind.Flags,FR_DOWN
                invoke    _FindText
            .endif
;********************************************************************
        .elseif    eax ==    WM_INITMENU
            call    _SetStatus
        .elseif    eax ==    idFindMessage
            .if    stFind.Flags & FR_DIALOGTERM
                mov    hFindDialog,0
            .else
                invoke    _FindText
            .endif
;********************************************************************
        .elseif    eax ==    WM_ACTIVATE
            mov    eax,wParam
            .if    (ax ==    WA_CLICKACTIVE ) || (ax == WA_ACTIVE)
                invoke    SetFocus,hWinEdit
            .endif
;********************************************************************
        .elseif    eax ==    WM_CREATE
            push    hWnd
            pop    hWinMain
            invoke    _Init
;********************************************************************
        .elseif    eax ==    WM_CLOSE
            call    _Quit
;********************************************************************
        .else
            invoke    DefWindowProc,hWnd,uMsg,wParam,lParam
            ret
        .endif
;********************************************************************
        xor    eax,eax
        ret

_ProcWinMain    endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_WinMain    proc
        local    @stWndClass:WNDCLASSEX
        local    @stMsg:MSG
        local    @hAccelerator,@hRichEdit

        invoke    LoadLibrary,offset szDllEdit
        mov    @hRichEdit,eax
        invoke    GetModuleHandle,NULL
        mov    hInstance,eax
        invoke    LoadMenu,hInstance,IDM_MAIN
        mov    hMenu,eax
        invoke    LoadAccelerators,hInstance,IDA_MAIN
        mov    @hAccelerator,eax
;********************************************************************
; 注册窗口类
;********************************************************************
        invoke    RtlZeroMemory,addr @stWndClass,sizeof @stWndClass
        invoke    LoadIcon,hInstance,ICO_MAIN
        mov    @stWndClass.hIcon,eax
        mov    @stWndClass.hIconSm,eax
        invoke    LoadCursor,0,IDC_ARROW
        mov    @stWndClass.hCursor,eax
        push    hInstance
        pop    @stWndClass.hInstance
        mov    @stWndClass.cbSize,sizeof WNDCLASSEX
        mov    @stWndClass.style,CS_HREDRAW or CS_VREDRAW
        mov    @stWndClass.lpfnWndProc,offset _ProcWinMain
        mov    @stWndClass.hbrBackground,COLOR_BTNFACE+1
        mov    @stWndClass.lpszClassName,offset szClassName
        invoke    RegisterClassEx,addr @stWndClass
;********************************************************************
; 建立并显示窗口
;********************************************************************
        invoke    CreateWindowEx,NULL,\
            offset szClassName,offset szCaptionMain,\
            WS_OVERLAPPEDWINDOW,\
            CW_USEDEFAULT,CW_USEDEFAULT,700,500,\
            NULL,hMenu,hInstance,NULL
        mov    hWinMain,eax
        invoke    ShowWindow,hWinMain,SW_SHOWNORMAL
        invoke    UpdateWindow,hWinMain
;********************************************************************
; 消息循环
;********************************************************************
        .while    TRUE
            invoke    GetMessage,addr @stMsg,NULL,0,0
            .break    .if eax    == 0
            invoke    TranslateAccelerator,hWinMain,@hAccelerator,addr @stMsg
            .if    eax == 0
                invoke    TranslateMessage,addr @stMsg
                invoke    DispatchMessage,addr @stMsg
            .endif
        .endw
        invoke    FreeLibrary,@hRichEdit
        ret

_WinMain    endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
        call    _WinMain
        invoke    ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        end    start
2008-07-11 23:52
wingyip
Rank: 1
等 级:新手上路
威 望:2
帖 子:119
专家分:0
注 册:2007-7-16
收藏
得分:0 
娃哈哈,很長啊!
謝謝樓上的分享啊!

2008-07-12 18:16
逍遥人生
Rank: 1
来 自:广西
等 级:新手上路
帖 子:14
专家分:0
注 册:2008-12-11
收藏
得分:0 
好复杂呀!
都看没懂的
呵呵
我刚学的
2008-12-11 21:43
greatbob2008
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2008-10-27
收藏
得分:0 
学习了。
2008-12-12 12:06
快速回复:完成记事本功能的几个问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.030871 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved