Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Правильно ли переведено выражение из С в Delphi? [D5, WinXP]


впорос ©   (2005-08-25 10:33:00) 

Правильно ли переведено выражение?

из:
typedef DWORD (*PMyType)(BOOL bParam, LPWSTR lpParam);

в:
type
 TMyType = function(bParam :boolean; lpParam :PWideChar) :Longword;
 PMyType = ^TMyType;


впорос   (2005-08-26 14:01:00) [1]

у меня ведется лог событий и лог загрузки выгрузки библиотеки
так вот загрузка библиотеки отмечается в логе, а выгрузка нет  попадает, хм.


han_malign   (2005-08-26 10:34:00) [2]

> а где мой DLL_PROCESS_DETACH ?
- в смысле?

Если это DLL написанная на Deplhi, то для всех подключенных модулей(unit) - на DLL_PROCESS_ATTACH вызывается секция initialization, на DLL_PROCESS_DETACH - finalization...


впорос   (2005-08-26 09:44:00) [3]

ну вот набросал библиотеку для Winlogon (через WLX)

загрузка:
1. DLL_PROCESS_ATTACH
2. Startup Event
3. Logon Event
4. StartShell Event

выключение:
1. Logoff Event
2. ShutDown Event
всё

а где мой DLL_PROCESS_DETACH ?


han_malign   (2005-08-25 16:33:00) [4]

> но VC в том конкретном случае посчитал размер bool = 1 байту
- ну дык, BOOLи bool- это разные типы в C(таки, case-sensitive), bool - C-generic тип с длинной 1 байт, а BOOL это платформозависимый тип, длина которого определяется разрядностью ОС...


Sapersky   (2005-08-25 16:16:00) [5]

BOOL - переводится как LongBool

Ну да, в Дельфи...
Как-то отконвертировал сишные заголовки автоматический конвертером, и он BOOL не стал трогать - так и перевёл, т.е. в Дельфи получился LongBool. Я потом до-олго искал источник глюков... нашёл только трассировкой Си-программы. Может, конечно, это зависит от компилятора и его настроек, но VC в том конкретном случае посчитал размер bool = 1 байту. А т.к. это было поле структуры, все последующие поля "съехали"...


han_malign   (2005-08-25 15:13:00) [6]

> callback вызывается нормально с тем переводом что в самом начале
MSDN: pStatusCallback - Reserved for internal use.
- по барабану как "переводить", будет работать и так:
TWLX_NOTIFICATION_INFO = packed record  
  Size           : LongWord;
  Flags          : LongWord;
  UserName       : PWideChar;
  Domain         : PWideChar
  WindowStation  : PWideChar;
  hToken         : THandle;
  hDesktop       : THandle;
  pStatusCallback: Pointer;
end;


З.Ы. На будущее: BOOL- переводится как LongBool;
typedef intBOOL;


впорос   (2005-08-25 14:13:00) [7]

у меня уже всё заработало .... или почти всё, но это уже другие проблемы

callback вызывается нормально с тем переводом что в самом начале


tesseract   (2005-08-25 14:10:00) [8]

TLoginCallback = function(bParam :boolean; lpParam :PWideChar):Longword; stdcall;
bParam скорее всего ни фига не boolean

TWLX_NOTIFICATION_INFO = packed record{  
size: cardinal;
flags:cardinal;
username:Pwidechar;
Domain:Pwidechar
WindowStation:PwideChar;
hToken:Thandle;
hDesktop:Thandle; (? не уверен)
pStatusCallback:TloginCallBack;
};
PWLX_NOTIFICATION_INFO= ^TWLX_NOTIFICATION_INFO;

Вроде так, но могу ошибаться.


впорос   (2005-08-25 11:59:00) [9]

конкретнее говоря мне надо перевести в Delphi эту
структуру
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/secauthn/security/wlx_notification_info.asp

typedef struct _WLX_NOTIFICATION_INFO {  
ULONG Size;  
ULONG Flags;  
PWSTR UserName;  
PWSTR Domain;  
PWSTR WindowStation;  
HANDLE hToken;  
HDESK hDesktop;  
PFNMSGECALLBACK pStatusCallback;
} WLX_NOTIFICATION_INFO, *PWLX_NOTIFICATION_INFO;

вот эта функция PFNMSGECALLBACK pStatusCallback ...
объявлен тип следующим образом:
typedef DWORD (*PFNMSGECALLBACK)(BOOL bVerbose, LPWSTR lpMessage);

и нужно это для такой функции
void Event_Handler_Function_Name(PWLX_NOTIFICATION_INFO pInfo);
которая конечно же сидит в DLL

всё это называется Winlogon Notification Packages в MSDN


han_malign   (2005-08-25 11:49:00) [10]

PMyType - лишнее, TMyType - процедурный тип, в зависимости от контекста или прямого указания "@" - является указателем или "вызовом"...
TMyType = function(bParam :boolean; lpParam :PWideChar) :Longword; - если цепляется из DLL - вероятнее всего потребует указания   cdecl (extern "C"{...})или stdcall (extern "C"{CALLBACK/APICALL/PASCAL(устаревшее)/__declspec(dllexport/dllimport)...}).


Наверх

Титульная страница Поиск, карта сайта Написать письмо