1 | |
FASM Существует ли WinAPI для подготовки строки PATH к использованию в wsprintf - удвоить в строке одиночные '\'03.04.2021, 00:28. Показов 2327. Ответов 6
Парни, как конвертировать строку PATH с заменой \ на \\
Готовых MSDN решений в виде API похоже что наверное нет? Ох, побайтово что-то изобретать даже боюсь подумать! Всего лишь строку надо конвертнуть внутри кода, скажем GetCurrentDirectory() Мне потом надо в wstprintf() вставить строку.
0
|
03.04.2021, 00:28 | |
Ответы с готовыми решениями:
6
Удвоить все одиночные пробелы в предложении как можно выводить данные c помошью wsprintf() (winApi) Строки и множества. Удвоить каждое вхождение символа «а» в строке В строке удвоить символы. Удвоить строку. 2 разные программы |
Модератор
|
|
03.04.2021, 11:05 | 2 |
Слабо знаком с составом и возможностями WinAPI, а для конкретно этой задачи решал бы так:
1. сосчитать количество '\' в строке 2. получить новую длину строки 3. начиная с последнего символа, копировал в конец новой строки до равенства указателей, и одновременно удваивал требуемые символы.
1
|
03.04.2021, 15:43 [ТС] | 3 |
Кликните здесь для просмотра всего текста
Код
include '%fasm%/win64w.inc' ;; 'win64w.fincg' format PE64 CONSOLE ;; 6.2 at 0x1_0000 section '.flat' code readable executable writeable multi_concatenation: pop rdx xchg rax,rsi .strcpy: pop rsi .copy: movsb cmp byte [rsi],0 jnz .copy cmp qword [rsp],0 jnz .strcpy xchg rax,rsi pop rax jmp rdx Example: virtual at RBP - .FRAME dq ?,?,?,? .P5 dq ?,? .FRAME := $ - $$ assert .FRAME and 15 = 0 end virtual entry $ enter .FRAME,0 ; GetCurrentDirectory ; SHGetFolderPath mov ecx,sizeof input_buffer lea rdx,[input_buffer] call [GetCurrentDirectoryA] test eax,eax jz .fail ; pretend we don't know where the path came from, scan string to find end push rdi lea rdi,[input_buffer] mov ecx,-1 xor eax,eax repnz scasb ; RDI points to byte after zero byte! not ecx ; string bytes sub ecx,1 jz .fail ; zero length path std ; move backward from end of string scasb ; backup to zero byte mov al,'\' push 0 ; terminator for multi_concatenation ; gather non-slash fragments .more: mov byte [rdi+1],0 ; null terminate this fragment repnz scasb lea rdx,[rdi+2] ; our string fragment ; RDI is byte before slash push rdx lea rdx,[slashslash] push rdx jz .more pop rdx pop rdx push rdi ; last fragment is always string start cld ; back to default direction lea rdi,[output_buffer] call multi_concatenation xchg eax,edi lea rdi,[output_buffer] sub eax,edi ; byte in output buffer pop rdi mov dword [.P5],eax push STD_OUTPUT_HANDLE pop rcx call [GetStdHandle] xchg rcx,rax xor r9,r9 mov r8d,dword [.P5] lea rdx,[output_buffer] mov [.P5],r9 call [WriteConsoleA] .fail: leave retn slashslash db '\\',0 libraries 'kernel32' ; import section label input_buffer:4096 rb sizeof input_buffer label output_buffer:4096 rb sizeof output_buffer Есть какой-то суровый код, у меня он не запускается, неловко у автора было спросить .FRAME := $ - $$ Illegal instruction, видимо там персонифицированные инклюды с массой дополнений.
0
|
Эксперт Hardware
|
||||||
03.04.2021, 16:32 | 4 | |||||
Сообщение было отмечено semiono как решение
Решение
..а чё там думать?
тем-более что без копирования строки в новый буфер можно получить переполнение:
2
|
644 / 153 / 61
Регистрация: 08.04.2015
Сообщений: 398
|
||||||
03.04.2021, 18:37 | 5 | |||||
А вы уверены, что это на самом деле нужно?
В исходниках действительно пишут так:
3
|
03.04.2021, 20:00 [ТС] | 6 |
Конечно, уверен!
Мне надо в конфиг програмы записать путь к данным, у каждого свои причуды, вот они решили там двойные исползовать, небось питон или чтонибудь кросплатформенное использовали отсюда и странности. Я вот нечто такое искал UrlCreateFromPathA или SHGetFolderPathAndSubDirA, хотя надо поизучать, может есть всё же подходящее среди функций, я вот обратную функу UrlCreateFromPathA знал, а эту только увидел сейчас Добавлено через 17 минут Всем спасибо!
0
|
Модератор
|
|
03.04.2021, 20:12 | 7 |
semiono, мне кажется, что данное решение некорректно по причинам:
1) 32 разрядная адресация в 64 разрядной программе 2) нет оценки возможности переполнения - всё же правильнее было бы перед удвоением символов уточнить будущую длину строки 3) корректно использовать кодировку ANSI, а не UniCode?
1
|
03.04.2021, 20:12 | |
03.04.2021, 20:12 | |
Помогаю со студенческими работами здесь
7
В строке символов удалить все пробелы в начале и в конце строки, удвоить пробелы в середине строки и напечатать количество слов Существует ли аналог WinAPI для работы с HWND? Есть ли толковая документации по использованию WinApi в FASM? Одиночные замены в строке по функции Заменить в строке двойные символы на одиночные Нужен ваш совет по WinAPI (Combobox, Path) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |