none
API. Передача параметров в DeleteFile. RRS feed

  • Вопрос

  • Win32API. Почему в функцию DeleteFile надо передавать строку, а не указатель на неё? Как мне передать туда в Ассемблере путь из массива с заранее неизвесным размером? Пока такой проблемы у меня не возникло, но возможно возникнет. Надо прописывать "invoke DeleteFile, dword[path], dword[path+4], dword[path+8], dword[path+12]". Насколько я знаю все параметры в функции API в x86 Windows передаются через стек, а передача огромных путей через стек очень медленная. Почему не указатель?
    6 ноября 2019 г. 18:55

Ответы

  • >Почему в функцию DeleteFile надо передавать строку, а не указатель на неё?

    Этот вопрос не имеет смысла, так как основан на ложных предположениях.

    Начать с того, что DeleteFile - это не функция, а макрос Windows SDK, который может разворачиваться в две разные функции: DeleteFileA или DeleteFileW. Первая принимает указатель на массив char, вторая - на массив wchar_t. Никакого противопоставления между передачей строки или указателя на строку не может быть, потому что в С, на системе типов которого основан WinAPI, просто нет понятия строки, передающейся по значению. В С строка - это массив символов, а массивы передаются в функции только как указатели. Когда вы используете высокоуровневую директиву Invoke (видимо, MASM?), все внешне выглядит как передача по значению. Но попробуйте дизассемблировать полученный код до элементарных инструкций, и вы увидите, что на самом деле передается указатель. 

    7 ноября 2019 г. 18:32

Все ответы

  • Здравствуйте.

    Тут можно лишь предположить, что "по умолчанию" API Win32 "заточены" для С++, а не Ассемблера. Поэтому строка, а не указатель.


    Alexandr_Smirnoff

    6 ноября 2019 г. 23:56
  • >Почему в функцию DeleteFile надо передавать строку, а не указатель на неё?

    Этот вопрос не имеет смысла, так как основан на ложных предположениях.

    Начать с того, что DeleteFile - это не функция, а макрос Windows SDK, который может разворачиваться в две разные функции: DeleteFileA или DeleteFileW. Первая принимает указатель на массив char, вторая - на массив wchar_t. Никакого противопоставления между передачей строки или указателя на строку не может быть, потому что в С, на системе типов которого основан WinAPI, просто нет понятия строки, передающейся по значению. В С строка - это массив символов, а массивы передаются в функции только как указатели. Когда вы используете высокоуровневую директиву Invoke (видимо, MASM?), все внешне выглядит как передача по значению. Но попробуйте дизассемблировать полученный код до элементарных инструкций, и вы увидите, что на самом деле передается указатель. 

    7 ноября 2019 г. 18:32