نمایش نتایج 81 تا 120 از 120

نام تاپیک: مرجع توابع دلفی

Threaded View

پست قبلی پست قبلی   پست بعدی پست بعدی
  1. #14

    آشتی با Assembly !

    درود به همه

    مدتی هست دارم توی دلفی اسمبلی کار میکنم ، یه چیز منو اذیت میکرد اونم استفاده از توابع API توی اسمبلی بود (ارسال دونه به دونه پارامترها و ...)که با تابع زیر مشکلم حل شد
    خدا کنه برای شما هم مفید باشه.

    اول یه مثال از انجام کار بدون تابعی که نوشتم و بعد هم یک مثال با استفاده از تابعی که نوشتم :
    function ASM_MessageBox(const AText, ACaption: AnsiString): DWORD;
    const
    user32 = 'user32.dll';
    Var
    pASM_MessageBox: Pointer;
    begin
    pASM_MessageBox := GetProcAddress(LoadLibrary(user32), 'MessageBoxA');
    if pASM_MessageBox <> nil then
    begin
    asm

    { ;push parameter N
    ;push parameter2
    ;push parameter1
    ;call procedure
    }
    PUSH EAX
    PUSH EBX
    XOR EBX, EBX // EBX = 0
    PUSH 4+64 // ;uType: UINT --> 4 = MB_YESNO and 46 = MB_ICONINFORMATION

    PUSH ACaption // ;lpCaption: PAnsiChar -->ACaption;
    PUSH AText // ;lpText: PAnsiChar --> AText

    PUSH 0 // ;hWnd: HWND -->0 = Application.Handle

    MOV EAX, pASM_MessageBox

    CALL EAX // Run MessageBoxA

    MOV Result,eax // Result --> 6=Yes | 7=NO
    POP EBX
    POP EAX
    end;
    end
    else
    ShowMessage('Oops !');
    end;

    اینم نحوه استفاده :
    procedure Test_ASM_MSG();
    var
    Ret: Integer;
    begin

    Ret := ASM_MessageBox('Like ??', 'MessageBox by Inline Assembly');
    if Ret = 6 then
    ShowMessage('Yes')
    else if Ret = 7 then
    ShowMessage('NO');

    end;


    اینم تابع :
    function ASM_Invoke(AFunction: Pointer; const AArguments: array of const)
    : Cardinal; stdcall;
    var
    iIndex, iCurrentArgument: Integer;
    begin
    Result := 0;

    for iIndex := High(AArguments) downto Low(AArguments) do
    begin
    iCurrentArgument := AArguments[iIndex].VInteger;
    asm
    push iCurrentArgument
    end;
    end;

    asm
    call AFunction
    mov Result, eax
    end;
    end;


    اینم همون مثال اول با تابعی که نوشتم:
    procedure Test_ASM_MSG();
    var
    Text: AnsiString;
    Caption: AnsiString;
    ret: Integer;
    begin

    Text := 'Hello World ';
    Caption := 'Test Invoke';

    ret := ASM_Invoke(@Winapi.Windows.MessageBoxA,
    [0, Text, Caption, MB_YESNO or MB_ICONINFORMATION]);
    if ret = 6 then
    ShowMessage('Yes')
    else if ret = 7 then
    ShowMessage('NO');

    end;

    موفق باشید
    آخرین ویرایش به وسیله بهروز عباسی : یک شنبه 04 فروردین 1392 در 11:23 صبح
    Everything that has a beginning has an end. ... The End?



قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •