德尔福 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)标记。因此,我不会处理在 interente 中找到的所有类型的示例。例如调用:
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 Types of actual andformal var parameters must be same”——指@hProv和@dwProvType。如果您想在 VAR 上替换 OUT 并在 PDword(dwProvType) 上替换文本 @dwProvType,则会出现错误:“E2197 常量对象不能作为 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 = 德尔福 VAR?或者他们没有指定?
2)我需要写常量吗?IN = 德尔福常数?
3) 带指针的类型。DWORD = 德尔福双字。好的。DWORD* = Delphi PDWROD(或所有标记 * = Delphi 指针类型)?
ps对不起英语不好。