Delphi Xe4. Например, есть две функции (Unicode):
CryptAcquireContext, CryptGetProvParam.
Я прочитал описание MSDN:
1) http://msdn.microsoft.com/en-us/library/windows/desktop/aa379886(v=vs.85).aspx
BOOL WINAPI CryptAcquireContext(
_Out_ HCRYPTPROV *phProv,
_In_ LPCTSTR pszContainer,
_In_ LPCTSTR pszProvider,
_In_ DWORD dwProvType,
_In_ DWORD dwFlags);
2) http://msdn.microsoft.com/en-us/library/windows/desktop/aa379929(v=vs.85).aspx
BOOL WINAPI CryptEnumProviders(
_In_ DWORD dwIndex,
_In_ DWORD *pdwReserved,
_In_ DWORD dwFlags,
_Out_ DWORD *pdwProvType,
_Out_ LPTSTR pszProvName,
_Inout_ DWORD *pcbProvName);
Если я правильно понял, то в переводе на Delphi должно быть так:
{S} Function CryptAcquireContext(Out hpProv:PNativeUInt;Const Container:PWideChar;
Const Provider:PWideChar;Const ProvType:DWord;Const Flags:DWord):Bool; StdCall; External Advapi32dll Name 'CryptAcquireContextW';
{S} Function CryptEnumProviders(Const Index:DWord;Const Reserved:PDWord;Const Flags:DWord;
Out ProvType:PDWord;Out pszProvName:DWord;Var pcbProvName:DWord):Bool; StdCall; External Advapi32dll Name 'CryptEnumProvidersW';
В первую очередь интересуют параметры возврата, отмеченные «OUT» и «VAR» (Out, InOut). Таким образом, я не работаю со всеми видами примеров, которые встречаются в интеренте. Например звонки:
Procedure Test;
var hProv:NativeUInt;provName: array[0..200] of char;dwProvType: DWORD;
begin
...
if not CryptAcquireContext(@hProv, nil, provName, dwProvType,CRYPT_VERIFYCONTEXT) then RaiseLastOSError;
...
while CryptEnumProviders(i, nil, 0,@dwProvType, nil, @cbName)) do
begin
..
end;
Выдайте ошибку компиляции: «E2033 Типы фактических и формальных параметров var должны быть идентичны» - относится к @ hProv и @ dwProvType. Если вы хотите заменить OUT на VAR и текст @dwProvType на PDword (dwProvType), выдает ошибку: «E2197 Constant object не может быть передан как параметр var».
Если я не укажу параметры ввода и вывода (например, http://www.bvbcode.com/code/oyma7f3h-1618784, строка №692), все компилируется, работает и работает нормально (Const - без эффекта):
{S} Function CryptAcquireContext(hpProv:PNativeUInt;Container:PWideChar;Provider:PWideChar;ProvType:DWord;Flags:DWord):Bool; StdCall; External Advapi32dll Name 'CryptAcquireContextW';
{S} Function CryptEnumProviders(Index:DWord;Reserved:PDWord;Flags:DWord;ProvType:PDWord;pszProvName:PWideChar;pcbProvName:PDWord):Bool; StdCall; External Advapi32dll Name 'CryptEnumProvidersW';
В прошлом вопросе мне советовали брать значения функций JEDI API. Я загрузил последнюю версию (http://sourceforge.net/projects/jedi-apilib/), Я вижу (блок JwaWinCrypt):
function CryptAcquireContext(var phProv: HCRYPTPROV; pszContainer: LPCTSTR;
pszProvider: LPCTSTR; dwProvType: DWORD; dwFlags: DWORD): BOOL; stdcall;
function CryptEnumProviders(dwIndex: DWORD; pdwReserved: LPDWORD; dwFlags: DWORD;
var pdwProvType: DWORD; pszProvName: LPTSTR; var pcbProvName: DWORD): BOOL; stdcall;
Вместо этого вызовите значения «OUT» и «INOUT» и напишите «VAR». Но эти мои примеры не работают. И pdwProvType и pcbProvName типа DWORD, хотя описание DWORD * = PDWORD?
Вопросы:
1) Как правильно сделать. MSDN OUT = Delphi OUT или VAR? IN_OUT = Delphi VAR? Или они не уточняют?
2) Надо ли писать Const? IN = Delphi Const?
3) Типы с указателями. DWORD = Delphi Dword. В порядке. DWORD * = Delphi PDWROD (или все отмеченные * = тип указателя Delphi)?
p.s. Простите за плохой английский.
Out
почти не реализован для Delphi. Помимо ссылок на интерфейс, это в основном синонимvar
- person Arioch 'The   schedule 16.07.2013