【问题标题】:Getting the current working directory in Assembly在 Assembly 中获取当前工作目录
【发布时间】:2015-05-17 00:49:06
【问题描述】:

我正在使用 Flat Assembler 编写从 .ini 文件中读取值的汇编代码,为了做到这一点,我正在尝试调用 Kernel 32.dll GetPrivateProfileInt 函数。

只有一个问题:为了正确读取文件,我需要将 .ini 的完整路径作为参数传递给该函数。我尝试将 '.\config.ini' 作为参数传递,并且我还尝试使用 MAX_PATH/rb MAX_PATH 来获取完整的工作目录(有时在 FASM 中有效),但这也不起作用.. .

如果有人可以帮助我,我将不胜感激!

这是我当前的代码:

[...]

invoke GetPrivateProfileInt,.secname,.keyname,-1,.inifile

cmp eax,1
je .start

invoke   MessageBoxA,0,.inifile,.secname,MB_ICONERROR

 [...]

.inifile: db '.\config.ini',0
.secname: db 'config',0
.keyname: db 'advanced',0

(注意:这个消息框代码只是为了了解该函数是否真的从 config.ini 读取值而包含的内容)

还有我要读取的 .ini 文件:

[config]
advanced=1

再次,如果有人可以帮助我,我将不胜感激!

【问题讨论】:

  • @lurker FASM 不在字符串中使用转义。
  • @johnfound 好的,谢谢

标签: winapi assembly fasm


【解决方案1】:

实际上,这种行为在MSDN中有描述。

lpFileName [in]

初始化文件的名称。如果该参数不包含文件的完整路径,则系统在Windows目录中搜索该文件。

如果您想完全使用当前工作目录(并不总是可执行文件所在的目录),请使用GetCurrentDirectory API 获取当前工作目录,然后在此字符串之后附加配置文件。

但通常你想从放置可执行文件的目录中读取配置文件。

在这些情况下,我使用类似以下内容:

.aminitwindow:
; Create string with the filename of the INI file.

        lea     ebx, [.str]
        invoke  GetModuleFileNameA, NULL, ebx, 512
        mov     ecx, eax

.findloop:
        dec     eax
        js      .notfound

        cmp     byte [ebx+eax], '.'
        je      .found
        jmp     .findloop

.notfound:
        mov     eax, ecx
.found:
        mov     dword [ebx+eax], '.cfg'
        mov     byte [ebx+eax+4], 0

        lea     esi, [eax+16]

这里我构造了配置文件的名字,只是把可执行文件的扩展名(从.exe改成.cfg)改了。如果您想使用不同的名称,只需扫描回第一个“\”字符,然后添加配置文件的整个文件名。

【讨论】:

    猜你喜欢
    • 2020-06-03
    • 2012-07-22
    • 2010-09-18
    • 1970-01-01
    • 2012-04-12
    • 2011-06-19
    • 2021-01-18
    相关资源
    最近更新 更多