在程序集中CommandLineToArgvW Windows功能的问题

时间:2012-03-06 00:17:43

标签: windows winapi assembly command-line

我正在尝试使用NASM中的 CommandLineToArgvW 窗口的API函数打印出 argc 的值。以下是我所拥有的:

extern _ExitProcess@4
extern _GetCommandLineA@0
extern _CommandLineToArgvW@8
extern printf

global _start
section .code

Format:
    db "%d",10,0
FormatS:
    db "%s",10,0
_start:
    push ebp
    mov ebp, esp
    sub esp, 4 ; Create empty space for ArgC
    call _GetCommandLineA@0
    push eax; Push value beneath ArgC
    mov ebx, ebp ; Set ebx to ebp
    sub ebx, 4
    push dword ebx ; pushes ArgC address onto stack
    push dword [ebp - 8] ; pushes pointer to Command Line String
    call _CommandLineToArgvW@8
    push dword [ebp - 4]
    push Format
    call printf
    push dword 0
    call _ExitProcess@4

无论我做什么,argc的值是1.我做错了什么?

我汇编并链接这些命令:

nasm -fwin32 FunctionTests.asm
golink FunctionTests.obj kernel32.dll msvcrt.dll shell32.dll /console /entry _start
FunctionTests.exe hi asdf asdf asdf asdf

如您所见,从最后一行开始,argc应为6。

4 个答案:

答案 0 :(得分:3)

在您致电CommandLineToArgvW之前设置一个断点并检查您即将通过的参数。注意,您传递的第一个参数不是指向字符串的指针。它是指向字符串指针的指针。

答案 1 :(得分:3)

将_GetCommandLineA更改为_GetCommandLine * W * CommandLineToArgv需要指向UNICODE字符串的指针。

MASM但差不多:

start:
    push    ebp
    mov     ebp, esp
    sub     esp, 4

    call    GetCommandLineW

    lea     ecx, dword ptr[ebp - 4] ; need the address of local
    push    ecx                     ; address of local
    push    eax                     ; pointer to unicode string
    call    CommandLineToArgvW

    push    dword ptr [ebp - 4]     ; value of local
    push    offset Format
    call    crt_printf
    add     esp, 8

    ; this is all?  Then we don't have to restore stack.
    push    0
    call    ExitProcess
end start

这是输出:

D:\ Projects> ConTest.exe boo boo我见到你了

6

d:\项目与GT;

答案 2 :(得分:2)

您需要使用 GetCommandLineW 而不是 GetCommandLineA

答案 3 :(得分:2)

您正在使用带有 ANSI 字符串的 CommandLineToArgvW ,使用 GetCommandLineW 以unicode获取命令行。

您也没有取消引用指向命令行的指针:

push ebx ; pushes ArgC address onto stack