в общем не могу понять что же я делаю неправильно, да и у меня возникает мысль что я непонимаю что передавать вторым аргументом в эту функцию: Код (Text): section '.code' code readable writable executable entry $ __start: mov ebp,esp invoke GetCommandLineW invoke CommandLineToArgvW,eax,getcommand mov eax,getcommand я знаю что это избитая тема, но никак немогу сообразить как правильно работать с оной функой
а в MSDN смотрел? Там четко написано возвращает массив строк, во второй параметр записывается количество элементов в массиве http://msdn.microsoft.com/en-us/library/bb776391(VS.85).aspx
ну а зачем она тогда ? если допустим GetCommandLineW возвращает в eax всю строку, то можно просканить на наличие пробелов массив и выбирать вручную параметры и передавать куда угодно. Нет, хотелось бы не вручную этим заниматься, а на автомате использовать какие-то апишки.Какие только ? да и вообще парсить вручную массив - это глупо я думаю. Как выкрутиться с помощью каких-то апишек ?
ну смотри алгоритм таков: 1)сканим всю строку, находим в ней пробел(т.е параметр будет через пробел.Получаем указатель на начало параметра 2)находим размер параметра 3) mov esi,начало строки mov edi,куда будем записывать repemovsb 4)как поубирать после каждого символа 00 ? т.е 00438952 75 00 73 00 65 00 72 00 33 00 32 00 2E 00 64 00 u.s.e.r.3.2...d. 00438962 6C 00 6C 00 00 00 00 00 00 00 00 00 00 00 00 l.l............ сложность заключается еще в том, что конец строки должен потом заканчиваться нолем, потому что когда мы будем передавать параметр например в LoadLibrary, то он полюбому должен быть нолем, что мне вручную после удаления всех нолей вручную опять находить конец строки и дописывать вручную его чтоли ? или как ?
Строка формируется иначе. Если в имени есть хоть один пробел, то имя заключается в кавычки. > Проверяем первый символ строки. Если это " то число кавычек должно быть чётным и если за ним пробел - то это конец имени.
дайте блин, какой-то пример использования параметров коммандной строки(только пример несвязанный с окнами)
Код (Text): ; ######################################################################### .386 ; force 32 bit code .model flat, stdcall ; memory model & calling convention option casemap :none ; case sensitive include \masm32\include\kernel32.inc GetCL PROTO :DWORD,:DWORD .code ; ######################################################################### GetCL proc ArgNum:DWORD, ItemBuffer:DWORD ; ------------------------------------------------- ; arguments returned in "ItemBuffer" ; ; arg 0 = program name ; arg 1 = 1st arg ; arg 2 = 2nd arg etc.... ; ------------------------------------------------- ; Return values in eax ; ; 1 = successful operation ; 2 = no argument exists at specified arg number ; 3 = non matching quotation marks ; 4 = empty quotation marks ; ------------------------------------------------- LOCAL lpCmdLine :DWORD LOCAL cmdBuffer[192] :BYTE LOCAL tmpBuffer[192] :BYTE push esi push edi invoke GetCommandLine mov lpCmdLine, eax ; address command line ; ------------------------------------------------- ; count quotation marks to see if pairs are matched ; ------------------------------------------------- xor ecx, ecx ; zero ecx & use as counter mov esi, lpCmdLine @@: lodsb cmp al, 0 je @F cmp al, 34 ; [ " ] character jne @B inc ecx ; increment counter jmp @B @@: push ecx ; save count shr ecx, 1 ; integer divide ecx by 2 shl ecx, 1 ; multiply ecx by 2 to get dividend pop eax ; put count in eax cmp eax, ecx ; check if they are the same je @F pop edi pop esi mov eax, 3 ; return 3 in eax = non matching quotation marks ret @@: ; ------------------------ ; replace tabs with spaces ; ------------------------ mov esi, lpCmdLine lea edi, cmdBuffer @@: lodsb cmp al, 0 je rtOut cmp al, 9 ; tab jne rtIn mov al, 32 rtIn: stosb jmp @B rtOut: stosb ; write last byte ; ----------------------------------------------------------- ; substitute spaces in quoted text with replacement character ; ----------------------------------------------------------- lea eax, cmdBuffer mov esi, eax mov edi, eax subSt: lodsb cmp al, 0 jne @F jmp subOut @@: cmp al, 34 jne subNxt stosb jmp subSl ; goto subloop subNxt: stosb jmp subSt subSl: lodsb cmp al, 32 ; space jne @F mov al, 254 ; substitute character @@: cmp al, 34 jne @F stosb jmp subSt @@: stosb jmp subSl subOut: stosb ; write last byte ; ---------------------------------------------------- ; the following code determines the correct arg number ; and writes the arg into the destination buffer ; ---------------------------------------------------- lea eax, cmdBuffer mov esi, eax lea edi, tmpBuffer mov ecx, 0 ; use ecx as counter ; --------------------------- ; strip leading spaces if any ; --------------------------- @@: lodsb cmp al, 32 je @B l2St: cmp ecx, ArgNum ; the number of the required cmdline arg je clSubLp2 lodsb cmp al, 0 je cl2Out cmp al, 32 jne cl2Ovr ; if not space @@: lodsb cmp al, 32 ; catch consecutive spaces je @B inc ecx ; increment arg count cmp al, 0 je cl2Out cl2Ovr: jmp l2St clSubLp2: stosb @@: lodsb cmp al, 32 je cl2Out cmp al, 0 je cl2Out stosb jmp @B cl2Out: mov al, 0 stosb ; ------------------------------ ; exit if arg number not reached ; ------------------------------ .if ecx < ArgNum mov edi, ItemBuffer mov al, 0 stosb mov eax, 2 ; return value of 2 means arg did not exist pop edi pop esi ret .endif ; ------------------------------------------------------------- ; remove quotation marks and replace the substitution character ; ------------------------------------------------------------- lea eax, tmpBuffer mov esi, eax mov edi, ItemBuffer rqStart: lodsb cmp al, 0 je rqOut cmp al, 34 ; dont write [ " ] mark je rqStart cmp al, 254 jne @F mov al, 32 ; substitute space @@: stosb jmp rqStart rqOut: stosb ; write zero terminator ; ------------------ ; handle empty quote ; ------------------ mov esi, ItemBuffer lodsb cmp al, 0 jne @F pop edi pop esi mov eax, 4 ; return value for empty quote ret @@: mov eax, 1 ; return value success pop edi pop esi ret GetCL endp ; ######################################################################### end
Код (Text): invoke GetCommandLineA invoke CommandLineToArgvA,eax,getcommand епта и будет тебе АСКИ окончание W - значит работа с вайдстринг окончание A - значит работа с аски
patolog Проблема в том, что у CommandLineToArgv нет ASCII-варианта. Поэтому дальше надо либо конвертировать результат в аски (WideCharToMultiByte), либо юзать стороннюю (http://alter.org.ua/docs/win/args/), либо дергать LoadLibraryW вместо LoadLibraryA
int Wc2Str( WCHAR* pwcBuf, char* pBuf, int BufLen ){ if( pwcBuf == NULL || pBuf == NULL ) return -1; if( BufLen == 0 )BufLen = wcslen(pwcBuf)+1; if( WideCharToMultiByte(CP_ACP, 0, pwcBuf, -1, pBuf, BufLen, NULL, NULL) == 0 )return -1; pBuf[wcslen(pwcBuf)] = 0; return 0; } зиродей, нот фор дистрибуте)
а чем это реализация в цэ отличается от асма? тем что вместо func(1) пишетцо push 1 call func ? или вам надо перевести фунцею и прокомментировать кодес?
w2c proc pwideWORD, pcharWORD, lenWORD cmp pwide, 0 je exit cmp pchar, 0 je exit cmp len, 0 jne len_defined push pwide call wcslen sub esp, 4*1 inc eax len_defined : mov eax, len xor ebx, ebx push ebx push ebx push eax push pchar push -1 push pwide push ebx push CP_ACP // хз как она продефайнена call WideCharToMultiByte exit: ret w2c endp както так