Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Аватара для Johny777

Ветеран


Сообщения: 649
Благодарности: 444

Профиль | Отправить PM | Цитировать


Shkutu, И правильно ругается. Т.к. в библиотеке нет имени функции под названием "PathFileExists".
дело в том что все WINAPI функции и процедуры где во входных аргументах есть "строка" функция задаётся двумя типами:
имя_функцииW - сокр. Wide - стока символов в который каждый символ лежит в Word-е
имя_функцииA - сокр. Ansi - стока символов в который каждый символ лежит в Byte-е
PWideChar, PAnsiChar - типизированный указатель на первый байт строки.
сама по себе типизация - это приблуда языков для упрощения адресной арифметики,
скажем адрес первого байта 1000000 и он лежит в переменной типа типизированного указателя P: PWideChar
получаешь значение по адресу в P так: P^
чтоб получить след. символ нужно прибавить к P единицу ( P + 1 ). При этом числовое значение указателя становится 1000002 тк SizeOf(WideChar) = 2 байта,
Те компилятор знает благодаря типизации на сколько байт нужно сместиться
можно и так NativeUInt(P) + SizeOf(WideChar)

в PAnsiChar смещение (или шаг) на 1 байт соответственно


при это String это самый обычный указатель
попробуй если интересно в нормальном языке сделать так:

читать дальше »
Код: Выделить весь код
program Project3;

{$APPTYPE CONSOLE}

uses
    SysUtils;

var
    s: AnsiString = 'abc';

begin
    WriteLn( NativeUInt( s ), #32#32, NativeUInt( PAnsiChar(s) ), #32#32, NativeUInt( @s[1] ) );
    WriteLn( PAnsiChar( s )^, #32#32, s[1] );

    ReadLn;
end.



и ты увидишь что и адреса и символы равны

если мне память не изменяет, то в Ansi версии инно все String по дефолту AnsiString , а в юникодной версии WideString
и так как мы выяснили что (Wide/Ansi)String = P(Wide/Ansi)Char = Pointer, то канает следующее:

читать дальше »
Код: Выделить весь код
#ifdef UNICODE
    function PathFileExists( pszPath: String ): BOOL;
      external 'PathFileExistsW@Shlwapi.dll stdcall delayload';
#else
    function PathFileExists( pszPath: String ): BOOL;
      external 'PathFileExistsA@Shlwapi.dll stdcall delayload';
#endif

procedure InitializeWizard();
begin
    if PathFileExists( 'C:\Program Files (x86)\OpenAL' ) then
        MsgBox('Ok', mbInformation, MB_OK)
    else
        MsgBox('Error', mbInformation, MB_OK);
end;

Последний раз редактировалось Johny777, 10-07-2014 в 15:48.

Это сообщение посчитали полезным следующие участники:

Отправлено: 15:08, 10-07-2014 | #1098