获取 Assembly 中的当前工作目录
Getting the current working directory in Assembly
我正在使用 Flat Assembler 编写汇编代码,它会从 .ini 文件中读取一个值,为了做到这一点,我正在尝试调用内核 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
再一次,如果有人能帮助我,我将不胜感激!
实际上,MSDN 中描述了此行为。
lpFileName [in]
The name of the initialization file. If this parameter does not contain a full path to the file, the system searches for the file in the Windows directory.
如果您想使用当前工作目录(并不总是可执行文件所在的目录),请使用 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)。如果您想使用不同的名称,只需扫描回第一个“\”字符,然后添加您的配置文件的整个文件名。
我正在使用 Flat Assembler 编写汇编代码,它会从 .ini 文件中读取一个值,为了做到这一点,我正在尝试调用内核 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
再一次,如果有人能帮助我,我将不胜感激!
实际上,MSDN 中描述了此行为。
lpFileName [in]
The name of the initialization file. If this parameter does not contain a full path to the file, the system searches for the file in the Windows directory.
如果您想使用当前工作目录(并不总是可执行文件所在的目录),请使用 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)。如果您想使用不同的名称,只需扫描回第一个“\”字符,然后添加您的配置文件的整个文件名。