Показать сообщение отдельно
  #30  
Старый 24.10.2012, 17:42
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Смотря как использовать.
Код:
function Func1(const p: PAnsiChar): Integer; stdcall;
begin
 MessageBoxA(0,p,0,0);
end;

function Func2(p: PAnsiChar): Integer; stdcall;
begin
 MessageBoxA(0,p,0,0);
end;

; ---------------------------------------------------------
Project1.dpr.13: begin
00418F0C 55               push ebp
00418F0D 8BEC             mov ebp,esp
00418F0F 51               push ecx
Project1.dpr.14: MessageBoxA(0,p,0,0);
00418F10 6A00             push $00
00418F12 6A00             push $00
00418F14 8B4508           mov eax,[ebp+$08]
00418F17 50               push eax
00418F18 6A00             push $00
00418F1A E875F8FEFF       call MessageBoxA
Project1.dpr.15: end;
00418F1F 8B45FC           mov eax,[ebp-$04]
00418F22 59               pop ecx
00418F23 5D               pop ebp
00418F24 C20400           ret $0004
; --------------------------------------------------------
Project1.dpr.17: begin
00418F28 55               push ebp
00418F29 8BEC             mov ebp,esp
00418F2B 51               push ecx
Project1.dpr.18: MessageBoxA(0,p,0,0);
00418F2C 6A00             push $00
00418F2E 6A00             push $00
00418F30 8B4508           mov eax,[ebp+$08]
00418F33 50               push eax
00418F34 6A00             push $00
00418F36 E859F8FEFF       call MessageBoxA
Project1.dpr.19: end;
00418F3B 8B45FC           mov eax,[ebp-$04]
00418F3E 59               pop ecx
00418F3F 5D               pop ebp
00418F40 C20400           ret $0004
Видно, что в коде функций нет совершенно никакой разницы, хотя объявлена одна с Const, другая без. Ошибки тут могут быть только из-за проверок компилятора.

А вот пример номер два:
Код:
function Func1(var p: AnsiString): Integer; stdcall;
begin
 MessageBoxA(0,PAnsiChar(p),0,0);
end;
function Func2(p: AnsiString): Integer; stdcall;
begin
 MessageBoxA(0,PAnsiChar(p),0,0);
end;

; ----------------------------------------------------------

Project1.dpr.13: begin
00418F1C 55               push ebp
00418F1D 8BEC             mov ebp,esp
00418F1F 51               push ecx
Project1.dpr.14: MessageBoxA(0,PAnsiChar(p),0,0);
00418F20 6A00             push $00
00418F22 6A00             push $00
00418F24 8B4508           mov eax,[ebp+$08]                 // Берем параметр
00418F27 8B00             mov eax,[eax]                         // <------- Вот оно!
00418F29 E872CAFEFF       call @LStrToPChar
00418F2E 50               push eax
00418F2F 6A00             push $00
00418F31 E86EF8FEFF       call MessageBoxA
Project1.dpr.15: end;
00418F36 8B45FC           mov eax,[ebp-$04]
00418F39 59               pop ecx
00418F3A 5D               pop ebp
00418F3B C20400           ret $0004
00418F3E 8BC0             mov eax,eax
; ----------------------------------------------------------
Project1.dpr.17: begin
00418F40 55               push ebp
00418F41 8BEC             mov ebp,esp
00418F43 51               push ecx
00418F44 8B4508           mov eax,[ebp+$08]                  // берем параметр
00418F47 E890C6FEFF       call @LStrAddRef               // не обращаем внимания, это inc количества текущих ссылок на строку, делается для защиты многопоточности
00418F4C 33C0             xor eax,eax
00418F4E 55               push ebp
00418F4F 68848F4100       push $00418f84
00418F54 64FF30           push dword ptr fs:[eax]        // Для хендла исключений
00418F57 648920           mov fs:[eax],esp
Project1.dpr.18: MessageBoxA(0,PAnsiChar(p),0,0);
00418F5A 6A00             push $00
00418F5C 6A00             push $00
00418F5E 8B4508           mov eax,[ebp+$08]              // снова берем параметр
00418F61 E83ACAFEFF       call @LStrToPChar             // перевод в PChar (фактически return eax)
00418F66 50               push eax
00418F67 6A00             push $00
00418F69 E836F8FEFF       call MessageBoxA
Project1.dpr.19: end;
00418F6E 33C0             xor eax,eax
00418F70 5A               pop edx
00418F71 59               pop ecx
00418F72 59               pop ecx
00418F73 648910           mov fs:[eax],edx                 // Восстанавливаем все
00418F76 688B8F4100       push $00418f8b
00418F7B 8D4508           lea eax,[ebp+$08]
00418F7E E889C5FEFF       call @LStrClr                   // снимаем ссылку на строку
00418F83 C3               ret 
00418F84 E977BCFEFF       jmp @HandleFinally
00418F89 EBF0             jmp $00418f7b
00418F8B 8B45FC           mov eax,[ebp-$04]
00418F8E 59               pop ecx
00418F8F 5D               pop ebp
00418F90 C20400           ret $0004

Видно, что первая делает mov eax, [eax]. Что означает взять значение по указателю. То есть ей передался указатель на строку s (скорее даже "указатель на указатель на строку").
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием