Бред, но раз тебе приятно так думать, i don't mind. а речь о лишних движениях, или таки о строках? Ну да ладно, вопрос о строках мы уже выяснили, остальное уже не так интересно
Весело тут у вас. Вот пример кода длл-ки: StrCrt proc stroka:dword mov subtr,remove$(stroka," ") mov eax,subtr ret StrCrt endp Возращает <b>строку</b>!!! Но - размер строки не равен результирующей длине строки, возращает результат, нулевой байт(как признак конца строки) и "остаток" - длина строки на выходе равна длине строки на входе. Как быть?
А вот и рабочая функция: Declare Function StrCrt(ByVal stroka as String) as String Private Sub Form_Load Dim d as String d=StrCrt("бла бла бла") Me.AutoRedraw = True Me.Print d End Sub возращает блаблабла и hex 00h32h32 и бла
OFFSIDE ведь уже всё в мельчайших подробностях разжевано: Код (Text): ;получаем длину результирующей строки invoke lstrlen, subtr ;создаём 'каркас' строки для возвращения в VB invoke SysAllocStringByteLen, NULL, eax ;заполняем 'каркас' строкой, которую нужно вернуть invoke lstrcpy, eax, subtr ;возвращаем строку ret
Блин, а где делась ссылка редактирования? После invoke SysAllocStringByteLen, NULL, eax вставь push eax, а перед ret - pop eax
cresta Большое спасибо, еще вопросик можно? А если не делать push и pop, ведь ничего не измениться, правильно?
Улыбнуло русское слово кириллицей. В данном случае - нет, т.к. lstrcpy возвращает указатель на буфер, то есть, 1 аргумент.
cresta В твоем примере: Код (Text): SomeFunc proc uses ebx esi edi lpInput1:DWORD, lpInput2:DWORD invoke lstrlen,lpInput1 mov ebx,eax invoke lstrlen,lpInput2 mov esi,eax lea ecx,[ebx+eax+1] invoke SysAllocStringByteLen, NULL, ecx mov edi,eax invoke lstrcpy, edi, lpInput1 mov byte ptr[edi+ebx],32 invoke lstrcat,edi,lpInput2 mov eax,edi ret SomeFunc endp Объясни плиз lea ecx,[ebx+eax+1] - это длина строки? invoke SysAllocStringByteLen, NULL, ecx mov edi,eax eax - это указатель?
в ebx длина первой строки, в eax - длина второй строки, 1 - длина пробела между строками. В сумме получается длина буфера, который надо выделить под две входные строки и пробел между ними. совершенно верно, edi - адрес выходной строки (той, которая формируется), ebx - смещение от её начала, равное длине первой входной строки. На этом смещении от начала вставляется пробел (его код - 32) замени byte ptr на word ptr (это опечатка).
OFFSIDE Откуда мне знать, что делает этот макрос и делает ли он это правильно? Sub ничего не возвращает, на то он и Sub. Ваши фразы вообще понять невозможно или я один туплю.
Quantum Возвращает переменная, в примере d... То есть код при загрузке основного окна формы выводит на себя содержимое переменной, полученной в результате обработки. Выглядит блаблабла и hex 00h32h32 и бла . А что делает макрос, я не понимаю. Пытаюсь найти его в windows.inc
OFFSIDE Но всё равно решили его использовать, в надежде, что компилятор всё разрулит. Это же не VB!!! Ещё один макрос. Вообще, лучше забыть о макросах и сделать всё на чистом ассемблере для начала.