1. Что лучше определять в начале - структуры или одиночные куски? 2. Как можно избавиться от нехватки длинны буффера или же наоборот от затирания одних данных другими? Кстати что такое выравнивание, только не грузите сильно, в двух словах, что это практически? 3. Нужно ли для msdn api при однотипных вызовах резервировать разные переменные, или же можно одну использовать многократно, напр. phkResult, lpcbData итп. ? Надеюсь, что что-то общее здесь имеет место? Надоело всякие неожиданные грабли. Вот немного примера, есть ли здесь лажа и много ли я тут криво написал? Код (Text): mov [lpFileOp.wFunc],0x0003 mov [lpFileOp.fFlags],0x0014 invoke GetEnvironmentVariable,'SystemDrive',cmpi64,3 invoke lstrcat,cmpi64,'\Program Files' mov [lpFileOp.pFrom],cmpi64 invoke RegOpenKeyEx,HKEY_LOCAL_MACHINE,'Software\Microsoft\Windows\CurrentVersion',NULL,KEY_READ,phkResult invoke RegQueryValueEx,[phkResult],'ProgramFilesDir',NULL,NULL,FilesDir64,cb64 invoke RegCloseKey,[phkResult] cmp [FilesDir64],NULL jz @f invoke lstrcmpi,cmpi64,FilesDir64 cmp rax,NULL jz @f invoke SHFileOperation,lpFileOp @@: invoke GetEnvironmentVariable,'SystemDrive',cmpi86,3 invoke lstrcat,cmpi86,'\Program Files (x86)' mov [lpFileOp.pFrom],cmpi86 invoke RegOpenKeyEx,HKEY_LOCAL_MACHINE,'Software\Microsoft\Windows\CurrentVersion',NULL,KEY_READ,phkResult invoke RegQueryValueEx,[phkResult],'ProgramFilesDir (x86)',NULL,NULL,FilesDir86,cb86 invoke RegCloseKey,[phkResult] cmp [FilesDir86],NULL jz exit invoke lstrcmpi,cmpi86,FilesDir86 cmp rax,NULL jz exit invoke SHFileOperation,lpFileOp exit: invoke ExitProcess,NULL section '.data' readable writeable struct LPSHFILEOPSTRUCT hwnd dq NULL wFunc dq NULL pFrom dq NULL pTo dq NULL fFlags dq NULL fAnyOperationsAborted dq NULL hNameMappings dq NULL lpszProgressTitle dq NULL ends lpFileOp LPSHFILEOPSTRUCT cmpi64 rd MAX_PATH cmpi86 rd MAX_PATH FilesDir64 rd MAX_PATH FilesDir86 rd MAX_PATH cb64 dq MAX_PATH cb86 dq MAX_PATH phkResult dq NULL
1)Сейчас, по-моему, всё равно. Это раньше нужно было стараться впихнуть данные в секции. 2)Первый вопрос не понял. Выравнивание - отступ от определённого адреса. 3)Во первых нет MSDN API, есть WinAPI, переменные, как ты понимаешь, могут называться хоть ВасяПупкин, главное чтобы ты не затирал используемые данные. Это просто функции, не более.
Вот это точно нельзя вторично использовать - lpcbData, вообще этот параметр меня всегда раздражает, практически нигде не нужен тем более при чтении, дык он ещё и сохраняется хоть вручную вычищай! Хорошо проверил код, сначала как будто бы всё правильно, но при различной длинне данных в реестре косяк вышел, поэтому lpcb1 lpcb2 надёжнее. 2. Недавно был вопрос со структурой под win64ax, мне посоветовали align 8 кажись, но потом всё просто квордами разрешилось в данных структуры.
Semiono старайтесь вместо глобальных переменных использовать локальные. Это и будет экономить вам место, а не использование одной переменной под разные нужды.
Semiono, Правильное выравнивание полей структур (и правильный размер самой структуры, кратный её выравниванию) — это важно. Большинство элементов структуры выравнивается на их размер (исключение навскидку: 80-битные long double равняются на 8 байт; это указано в Intel SDM, см. #AC). Выравнивание самой структуры должно равняться наибольшему из выравниваний — мня, как коряво звучит — её полей (чтобы сами поля были адекватно выровнены). И, как уже сказано выше, размер структуры должен быть кратен её выравниванию (чтобы каждое поле элемента массива структур тоже было правильно выровнено). Примерно так. Для компилятора с языка высокого уровня учитывать эти факторы проще простого, а вот вручную — нужны хитрые макросы. Ну и при размещении переменных в стэке неплохо бы.