Ошибка преобразования типа WORD в LPWORD (в обычном Delphi в

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ошибка преобразования типа WORD в LPWORD (в обычном Delphi в

Сообщение calypso » 29.09.2011 21:24:31

Такой код выдает ошибку:
Код: Выделить всё
uses ShellApi;

procedure TForm1.Button1Click(Sender: TObject);
var
  IconIndex: word;
  h: hIcon;
begin
  IconIndex := 0;
  h := ExtractAssociatedIcon(hInstance,
    'C:WINDOWSNOTEPAD.EXE', IconIndex);

  DrawIcon(Form1.Canvas.Handle, 10, 10, h);
end;



что IconIndex должен быть lpWORD ,а не WORD. Если поставить lpWORD то тогда вылазит ошибка что идет присвоение Integer ,т.е. 0 переменной типа lpWORD.
На Делфи 7 этот код вроде как 100% работает.На Лазарусе нет. В чем загвоздка?

Добавлено спустя 6 минут 22 секунды:
И вторая проблема несовместимости Лазаруса и Делфи была замечена на примере кода для определения возможности прав пользователя в системе:
Код: Выделить всё
const
   SECURITY_NT_AUTHORITY: TSIDIdentifierAuthority =
     (Value: (0, 0, 0, 0, 0, 5));
   SECURITY_BUILTIN_DOMAIN_RID = $00000020;
   DOMAIN_ALIAS_RID_ADMINS = $00000220;

function IsAdmin: Boolean;
var
   hAccessToken: THandle;
   ptgGroups: PTokenGroups;
   dwInfoBufferSize: DWORD;
   psidAdministrators: PSID;
   x: Integer;
   bSuccess: BOOL;
begin
   Result   := False;
   bSuccess := OpenThreadToken(GetCurrentThread, TOKEN_QUERY, True,
     hAccessToken);
   if not bSuccess then
   begin
     if GetLastError = ERROR_NO_TOKEN then
       bSuccess := OpenProcessToken(GetCurrentProcess, TOKEN_QUERY,
         hAccessToken);
   end;
   if bSuccess then
   begin
     GetMem(ptgGroups, 1024);
     bSuccess := GetTokenInformation(hAccessToken, TokenGroups,
       ptgGroups, 1024, dwInfoBufferSize);
     CloseHandle(hAccessToken);
     if bSuccess then
     begin
       AllocateAndInitializeSid(SECURITY_NT_AUTHORITY, 2,
         SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS,
         0, 0, 0, 0, 0, 0, psidAdministrators);
       {$R-}
       for x := 0 to ptgGroups.GroupCount - 1 do
         if EqualSid(psidAdministrators, ptgGroups.Groups[x].Sid) then
         begin
           Result := True;
           Break;
         end;
       {$R+}
       FreeSid(psidAdministrators);
     end;
     FreeMem(ptgGroups);
   end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   if isAdmin then
     ShowMessage('Logged in as Administrator');
end;


Вылазит сообщение об ошибке что ptgGroups.GroupCount неправильный qualifier. Опять же,на Делфи этот код работает.
Здесь обращает внимание директива {$R-} (возможно в этом причина)
calypso
незнакомец
 
Сообщения: 4
Зарегистрирован: 29.09.2011 21:12:28

Re: Ошибка преобразования типа WORD в LPWORD (в обычном Delp

Сообщение Mr.Smart » 29.09.2011 21:52:03

Если мне не изменяет память, LPWORD, это указатель т.е. ^WORD.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Ошибка преобразования типа WORD в LPWORD (в обычном Delp

Сообщение calypso » 29.09.2011 22:17:10

IconIndex возвращает номер значка в файле,разве число 0 может быть указателем?
calypso
незнакомец
 
Сообщения: 4
Зарегистрирован: 29.09.2011 21:12:28

Re: Ошибка преобразования типа WORD в LPWORD (в обычном Delp

Сообщение Mr.Smart » 29.09.2011 22:33:38

У меня нет слов...
Код: Выделить всё
h := ExtractAssociatedIcon(hInstance,
    'C:WINDOWSNOTEPAD.EXE', @IconIndex);
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 237

Рейтинг@Mail.ru