请问一个关于API别名的问题 ( 积分: 50 )

  • 主题发起人 主题发起人 awfigsk
  • 开始时间 开始时间
A

awfigsk

Unregistered / Unconfirmed
GUEST, unregistred user!
[red]function _CreateMutex(lpMutexAttributes: PSecurityAttributes;<br> &nbsp;bInitialOwner: Integer; lpName: PChar): THandle; stdcall; external kernel32 name 'CreateMutexA';<br><br>function CreateMutex(lpMutexAttributes: PSecurityAttributes; bInitialOwner: BOOL; lpName: PChar): THandle;<br>begin<br> &nbsp;Result := _CreateMutex(lpMutexAttributes, Integer(Boolean(bInitialOwner)), lpName);<br>end;[/red]<br><br>[blue]function _CreateMutexA(lpMutexAttributes: PSecurityAttributes;<br> &nbsp;bInitialOwner: Integer; lpName: PAnsiChar): THandle; stdcall; external kernel32 name 'CreateMutexA';<br><br>function CreateMutexA(lpMutexAttributes: PSecurityAttributes; bInitialOwner: BOOL; lpName: PAnsiChar): THandle;<br>begin<br> &nbsp;Result := _CreateMutexA(lpMutexAttributes, Integer(Boolean(bInitialOwner)), lpName);<br>end;[/blue]<br>================================<br>像上面这种情况,如果我调用CreateMutexA函数,是执行哪个呢?_CreateMutex和_CreateMutexA都是取别名CreateMutexA。<br>还想问一下,在单元中可以重新定义所引用的API函数吗?如上面两个程序段,就是重新定义了所引用的API函数?
 
[red]function _CreateMutex(lpMutexAttributes: PSecurityAttributes;<br> &nbsp;bInitialOwner: Integer; lpName: PChar): THandle; stdcall; external kernel32 name 'CreateMutexA';<br><br>function CreateMutex(lpMutexAttributes: PSecurityAttributes; bInitialOwner: BOOL; lpName: PChar): THandle;<br>begin<br> &nbsp;Result := _CreateMutex(lpMutexAttributes, Integer(Boolean(bInitialOwner)), lpName);<br>end;[/red]<br><br>[blue]function _CreateMutexA(lpMutexAttributes: PSecurityAttributes;<br> &nbsp;bInitialOwner: Integer; lpName: PAnsiChar): THandle; stdcall; external kernel32 name 'CreateMutexA';<br><br>function CreateMutexA(lpMutexAttributes: PSecurityAttributes; bInitialOwner: BOOL; lpName: PAnsiChar): THandle;<br>begin<br> &nbsp;Result := _CreateMutexA(lpMutexAttributes, Integer(Boolean(bInitialOwner)), lpName);<br>end;[/blue]<br>================================<br>像上面这种情况,如果我调用CreateMutexA函数,是执行哪个呢?_CreateMutex和_CreateMutexA都是取别名CreateMutexA。<br>还想问一下,在单元中可以重新定义所引用的API函数吗?如上面两个程序段,就是重新定义了所引用的API函数?
 
在不同的单元中定义名称的函数,调用的顺序跟所引用的单元顺序有关,你可以直接用单元名来引用,比如beep函数,在windows和sysutils中都有定义,你可以这样用:<br><br>begin<br> &nbsp; windows.beep(1000,100);<br> &nbsp; sysutils.beep();<br>end;
 
但这两个函数都是在Windows这个单元里面定义的!
 
[brown]问:如果我调用CreateMutexA函数,是执行哪个呢?[/brown]<br>答:函数同名时发生重载,此时编译器将会根据你所调用的函数的参数个数与类型自动匹配与之相同的函数。在上述例子中:<br>  当lpName为[red]PChar[/red]型时调用function CreateMutex(lpMutexAttributes: PSecurityAttributes; bInitialOwner: BOOL; lpName: [red]PChar[/red]): THandle;<br>  当lpName为[red]PAnsiChar[/red]型时调用function CreateMutex(lpMutexAttributes: PSecurityAttributes; bInitialOwner: BOOL; lpName:[red] PAnsiChar[/red]): THandle;<br><br>[brown]问:_CreateMutex和_CreateMutexA都是取别名CreateMutexA。[/brown]<br>答:最终函数都调用动态库kernel32中的同一个CreateMutexA函数,因为PChar与PAnsiChar类型的结构特点是相似的。<br><br>[brown]问:还想问一下,在单元中可以重新定义所引用的API函数吗?[/brown]<br>答:可以,调用时可以指出单元域,不指出时编译器会自动匹配在引用语句中具有该函数的最后一个单元域。<br><br>[brown]问:如上面两个程序段,就是重新定义了所引用的API函数?[/brown]<br>答:正确,上述处理的方法的目的是为了类型匹配的需要,也就是说定义一个函数的多个参数类型的不同的函数时,可以使我们在程序中直接引用具有该类型参数的函数调用。但必须要注意参数结构的平衡。
 
[red]function _CreateMutex(lpMutexAttributes: PSecurityAttributes;<br> &nbsp;bInitialOwner: Integer; lpName: PChar): THandle; stdcall; external kernel32 name 'CreateMutexA';<br><br>function CreateMutex(lpMutexAttributes: PSecurityAttributes; bInitialOwner: BOOL; lpName: PChar): THandle;<br>begin<br> &nbsp;Result := _CreateMutex(lpMutexAttributes, Integer(Boolean(bInitialOwner)), lpName);<br>end;[/red]<br><br>abookdog大侠,我的意思的是:即然<br>function _CreateMutex(lpMutexAttributes: PSecurityAttributes;<br> &nbsp;bInitialOwner: Integer; lpName: PChar): THandle; stdcall; external kernel32 name 'CreateMutexA';<br>是引用了_CreateMutex函数并取了一个别名是CreateMutexA,那么在程序中就可以直接用CreateMutexA这个别名调用_CreateMutex函数.<br>但为何在下面又重新定义CreateMutexA函数?这个CreateMutexA也是指那个别名CreateMutexA吗?如果是,那不是重新定义了_CreateMutex函数了?<br>还请您指点,谢谢!
 
function _CreateMutex(lpMutexAttributes: PSecurityAttributes;<br> &nbsp;bInitialOwner: Integer; lpName: PChar): THandle; stdcall; external kernel32 name 'CreateMutexA';<br><br>这个不是取别名的意思,而是,这个API是调用kernel32里面名字为CreateMutexA的那个函数。
 
是呀,楼上说对了,其它这两个函数最后都是调用kernel32中的createmutexa函数
 
function _CreateMutex(lpMutexAttributes: PSecurityAttributes;<br> &nbsp;bInitialOwner: Integer; lpName: PChar): THandle; stdcall; external kernel32 name 'CreateMutexA';<br>  你的理解错误了。<br>  在上述语句中name后面跟的是库中函数的原名,并非给函数取的别名。<br>  真正的别名是指function后面跟的名称。<br><br>  为了帮助你的理解,以下给出函数导出语句的一般格式:<br>function 函数别名(参数列表):类型;函数调用修饰符;external 库名 name '库中函数名';<br>  <br>  这样你应该理解了吧!<br> &nbsp; &nbsp;<br><br><br><br>
 
哦,是了!我的理解错了!<br>现在明白过来了!<br>晕倒!怎么以前概念全部忘了似的!真是稀里糊涂!<br>十分感谢各位大侠的指点!!!<br>
 

Similar threads

I
回复
0
查看
781
import
I
I
回复
0
查看
906
import
I
I
回复
0
查看
601
import
I
后退
顶部