Delphi: декларация LONG_PTR, WNDPROC - PullRequest
1 голос
/ 10 октября 2010

Подскажите, пожалуйста, КАК объявлены следующие символы в Windows.pas для более новых версий Delphi?

  • LONG_PTR =?
  • WNDPROC =?

Я хочу, чтобы мой код был совместим с Delphi 2006, и я хочу не просто писать "Integer" или "Pointer", а "правильное" и официальное объявление.

Подскажите, пожалуйста, в какой версии Delphi функции

  • GetWindowLongPtr
  • SetWindowLongPtr

были официально добавлены? (Согласно http://qc.embarcadero.com/wc/qcmain.aspx?d=48771 кажется, что в Delphi 11 (2007) эта проблема была активной, а в Delphi 12 (2009) проблема была решена)

Ответы [ 3 ]

1 голос
/ 10 октября 2010

При работе с элементами управления VCL (TControl потомки, включая TCustomForm) вам не нужно использовать SetWindowLongPtr API для замены оконной процедуры; Вы можете установить свойство WindowProc для достижения того же результата. Я разместил пример здесь .

0 голосов
/ 10 октября 2010

GetWindowLongPtr и SetWindowLongPtr оба появляются в модуле windows Delphi 2009 (версия 12 компилятора).

{$EXTERNALSYM GetWindowLongPtr}
function GetWindowLongPtr(hWnd: HWND; nIndex: Integer): LONG_PTR; stdcall;
{$EXTERNALSYM SetWindowLongPtr}
function SetWindowLongPtr(hWnd: HWND; nIndex: Integer; dwNewLong: LONG_PTR): LONG_PTR; stdcall;

Также объявлены версии API Ansi и Wide, хотя нет никакой разницы, за исключением имени, и вызовы не перенаправляются, как во многих других функциях API, где «неукрашенная» версия MyApiFunction перенаправляется либо на MyApiFunctionA (до D2009) или функция MyApiFunctionW (D2009 +). Как в:

function MyApiFunction; external advapi32 name 'MyApiFunctionW';
function MyApiFunctionA; external advapi32 name 'MyApiFunctionA';
function MyApiFunctionW; external advapi32 name 'MyApiFunctionW';

Если D2006 не определяет их как @Frank Shearer, и проблема была открыта в QC для D2007 и закрыта для версии 12 (D200 (), я думаю, D2009 действительно является версией, в которой были добавлены эти объявления.

Обратите внимание, что вы всегда можете добавить объявление Windows API самостоятельно, если оно не предусмотрено версией Delphi, которую вы используете. И как всегда с функциями API, разумно знать, из какой версии Windows они существуют, чтобы не вызывать API, которые не существуют на платформе, на которой работает ваша программа.

0 голосов
/ 10 октября 2010

Я не знаю точную версию, которая представила Get / SetWindowLongPtr, но Delphi 2006 тоже не определяет.

Все нижеприведенные объявления взяты из Delphi 2006.

WNDPROC, вероятно,TFNWndProc, в Windows.pas:

TFarProc = Pointer;
TFNWndProc = TFarProc;

Classes.pas 'Подпись StdWndProc' выглядит так в Delphi 2006:

function StdWndProc(Window: HWND; Message, WParam: Longint;
  LParam: Longint): Longint; stdcall; assembler;

MSHTML.pas определяет LONG_PTR как:

LONG_PTR = Integer;

Это определение является единственным упоминанием LONG_PTR в исходном каталоге Delphi 2006.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...