Смотря как использовать.
Код:
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.
|