С Новым годом! Форум программистов, компьютерный форум, киберфорум
FASM
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
160 / 17 / 0
Регистрация: 14.09.2010
Сообщений: 466
Записей в блоге: 6
1
FASM

Существует ли WinAPI для подготовки строки PATH к использованию в wsprintf - удвоить в строке одиночные '\'

03.04.2021, 00:28. Показов 2327. Ответов 6

Author24 — интернет-сервис помощи студентам
Парни, как конвертировать строку PATH с заменой \ на \\
Готовых MSDN решений в виде API похоже что наверное нет?
Ох, побайтово что-то изобретать даже боюсь подумать!
Всего лишь строку надо конвертнуть внутри кода, скажем GetCurrentDirectory()
Мне потом надо в wstprintf() вставить строку.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.04.2021, 00:28
Ответы с готовыми решениями:

Удвоить все одиночные пробелы в предложении
2) Удвойте все одиночные пробелы в предложении. Спасибо заранее))

как можно выводить данные c помошью wsprintf() (winApi)
как можно вывести value=100 чет не получается int value =100; WCHAR szText;...

Строки и множества. Удвоить каждое вхождение символа «а» в строке
помогите пожалуйста решить задачу Удвоить каждое вхождение символа «а» в строке.

В строке удвоить символы. Удвоить строку. 2 разные программы
В строке удвоить символы. Удвоить строку. 2 разные программы

6
Модератор
Эксперт по электронике
8536 / 4388 / 1651
Регистрация: 01.02.2015
Сообщений: 13,635
Записей в блоге: 9
03.04.2021, 11:05 2
Слабо знаком с составом и возможностями WinAPI, а для конкретно этой задачи решал бы так:
1. сосчитать количество '\' в строке
2. получить новую длину строки
3. начиная с последнего символа, копировал в конец новой строки до равенства указателей, и одновременно удваивал требуемые символы.
1
160 / 17 / 0
Регистрация: 14.09.2010
Сообщений: 466
Записей в блоге: 6
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
Эксперт Hardware
6160 / 2397 / 398
Регистрация: 29.07.2014
Сообщений: 3,143
Записей в блоге: 4
03.04.2021, 16:32 4
Лучший ответ Сообщение было отмечено semiono как решение

Решение

Цитата Сообщение от semiono Посмотреть сообщение
Ох, побайтово что-то изобретать даже боюсь подумать!
..а чё там думать?
тем-более что без копирования строки в новый буфер можно получить переполнение:

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
format   pe console
include 'win32ax.inc'
entry    start
;//----------
.data
oldStr    db  'D:\Install\FASM\INCLUDE\API',0
buff      db  128 dup(0)
;//----------
.code
start:  invoke  lstrlen,oldStr    ;// вычисляем размер строки
        xchg    ecx,eax           ;// ECX = длина цикла
        mov     esi,oldStr        ;// источник
        mov     edi,buff          ;// приёмник
@@:     lodsb                     ;// читаем байты из ESI
        cmp     al,'\'            ;// тест..
        jne     @next             ;// нет
        mov     word[edi],'\\'    ;// иначе: запись в приёмник
        inc     edi               ;// указатель +1
@next:  stosb                     ;// перемещение текста по байтам
        loop    @b                ;// промотать ECX-раз..
 
       cinvoke  printf,<10,' Old string: %s',0>,oldStr
       cinvoke  printf,<10,' New string: %s',0>,buff
 
@exit: cinvoke  getch
       cinvoke  exit,0
;//---------------
section '.idata' import data readable
library  msvcrt,'msvcrt.dll',kernel32,'kernel32.dll',user32,'user32.dll'
import   msvcrt, printf,'printf',getch,'_getch',exit,'exit'
include 'api\kernel32.inc'
include 'api\user32.inc'
2
644 / 153 / 61
Регистрация: 08.04.2015
Сообщений: 398
03.04.2021, 18:37 5
Цитата Сообщение от semiono Посмотреть сообщение
как конвертировать строку PATH с заменой \ на \\
Всего лишь строку надо конвертнуть внутри кода, скажем GetCurrentDirectory()
Мне потом надо в wstprintf() вставить строку
А вы уверены, что это на самом деле нужно?
В исходниках действительно пишут так:
C
1
printf("%s", "C:\\Windows\\System32");
Это для компилятора, чтобы он правильно строку обработал. В исполняемом файле эта самая строка будет уже с одиночными слэшами. Если у вас строка получается в рантайме, то зачем в ней удваивать слэши?
3
160 / 17 / 0
Регистрация: 14.09.2010
Сообщений: 466
Записей в блоге: 6
03.04.2021, 20:00  [ТС] 6
Конечно, уверен!
Мне надо в конфиг програмы записать путь к данным, у каждого свои причуды, вот они решили там двойные исползовать,
небось питон или чтонибудь кросплатформенное использовали отсюда и странности.
Я вот нечто такое искал UrlCreateFromPathA или SHGetFolderPathAndSubDirA, хотя надо поизучать, может есть всё же
подходящее среди функций, я вот обратную функу UrlCreateFromPathA знал, а эту только увидел сейчас

Добавлено через 17 минут
Существует ли WinAPI для подготовки строки PATH к использованию в wsprintf - удвоить в строке одиночные '\'

Всем спасибо!
0
Модератор
Эксперт по электронике
8536 / 4388 / 1651
Регистрация: 01.02.2015
Сообщений: 13,635
Записей в блоге: 9
03.04.2021, 20:12 7
semiono, мне кажется, что данное решение некорректно по причинам:
1) 32 разрядная адресация в 64 разрядной программе
2) нет оценки возможности переполнения - всё же правильнее было бы перед удвоением символов уточнить будущую длину строки
3) корректно использовать кодировку ANSI, а не UniCode?
1
03.04.2021, 20:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.04.2021, 20:12
Помогаю со студенческими работами здесь

В строке символов удалить все пробелы в начале и в конце строки, удвоить пробелы в середине строки и напечатать количество слов
В строке символов удалить все пробелы в начале и в конце строки, удвоить пробелы в середине строки...

Существует ли аналог WinAPI для работы с HWND?
существует ли аналог winapi для работы с HWND ? #if defined (__WIN32__) #include...

Есть ли толковая документации по использованию WinApi в FASM?
Есть ли толковая документации по использованию winapi в fasm'e ?

Одиночные замены в строке по функции
Здравствуйте, у меня есть строка и мне в ней нужно заменить заменить одни и теже слова но на разные...

Заменить в строке двойные символы на одиночные
Ввести строчку длиной до 30 символов, заменить в ней двойные символы на одиночные, пробелы - на...

Нужен ваш совет по WinAPI (Combobox, Path)
У меня есть программа которая открывает файл и по заданным вершинам ищет, так вот у меня вопрос: на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru