关于API的声明问题 ( 积分: 100 )

  • 主题发起人 主题发起人 linzhengqqun
  • 开始时间 开始时间
L

linzhengqqun

Unregistered / Unconfirmed
GUEST, unregistred user!
C中对于CreateProcess的声明如下
BOOL CreateProcess(
LPCTSTR lpApplicationName,
LPTSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCTSTR lpCurrentDirectory,
LPSTARTUPINFO lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
);
而Delphi中的声明是这样的:
function CreateProcess(
lpApplicationName: PChar;
lpCommandLine: PChar;
lpProcessAttributes, lpThreadAttributes: PSecurityAttributes;
bInheritHandles: BOOL;
dwCreationFlags: DWORD;
lpEnvironment: Pointer;
lpCurrentDirectory: PChar;
const lpStartupInfo: TStartupInfo;
var lpProcessInformation: TProcessInformation
): BOOL; stdcall;

各位看看LPSTARTUPINFO lpStartupInfo,是一个指针,
而const lpStartupInfo: TStartupInfo;是一个常量的实参
这让我很迷惑,各位高手能不能讲讲是为什么
顺便谈谈复杂API用Delphi来声明的一些技巧啊。
 
C中对于CreateProcess的声明如下
BOOL CreateProcess(
LPCTSTR lpApplicationName,
LPTSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCTSTR lpCurrentDirectory,
LPSTARTUPINFO lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
);
而Delphi中的声明是这样的:
function CreateProcess(
lpApplicationName: PChar;
lpCommandLine: PChar;
lpProcessAttributes, lpThreadAttributes: PSecurityAttributes;
bInheritHandles: BOOL;
dwCreationFlags: DWORD;
lpEnvironment: Pointer;
lpCurrentDirectory: PChar;
const lpStartupInfo: TStartupInfo;
var lpProcessInformation: TProcessInformation
): BOOL; stdcall;

各位看看LPSTARTUPINFO lpStartupInfo,是一个指针,
而const lpStartupInfo: TStartupInfo;是一个常量的实参
这让我很迷惑,各位高手能不能讲讲是为什么
顺便谈谈复杂API用Delphi来声明的一些技巧啊。
 
在delphi里大多数的API都封装到shellApi单元里了,所以你要用到的时候引用shellApi单元就行了,不用声明
 
1、在 Pascal/Delphi 函数中,向声明为 “const” 或 “var” 的形参传递的是实参的地址(而不是它的内容),也就是指针了。而不加 “const” 或 “var” 修饰的形参即使在函数中改变内容,也不会影响到实参,说明传递的是内容,实参有一个副本;
2、这个与 C++ 函数里的“引用”(int p&)如出一辙,形参直接指向实参本身;
3、所以翻译 API 时注意参数的性质,是输入参数还是输出参数,一旦参数在 Delphi 中声明为 “const” 或 “var”,就要将它对应为 C++ 的指针。
 
const lpStartupInfo: TStartupInfo;实际上还是传地址
 
那么为什么 lpProcessAttributes, lpThreadAttributes: PSecurityAttributes;
这两个参数就直接用指针呢,这两个参数应该也是输入的,为什么不声明成Const呢
 
To linzhengqqun:
你可以写成“const lpProcessAttributes, lpThreadAttributes: TSecurityAttributes;”试试么。
 
后退
顶部