Author:admin

Date:2014-05-05T20:39:25.000000Z


git-svn-id: https://svn.eiffel.com/eiffel-org/trunk@1366 abb3cda0-5349-4a8f-a601-0c33ac3a8c38
This commit is contained in:
vwheeler
2014-05-06 01:38:50 +00:00
parent 47cab1f830
commit 505b7bdbe2
2 changed files with 24 additions and 8 deletions

View File

@@ -1,9 +1,29 @@
[[Property:title|Interfacing with DLLs]]
[[Property:weight|0]]
[[Property:uuid|4ad177dd-13ec-c237-99b3-efc9851995a5]]
Using EiffelStudio, there are two different ways to call C routines exported in DLLs. This is because on the Windows platform, there are two frequently-used calling conventions for C routines found in DLLs:
{{UnderConstruction}}
* _cdecl: referred to as the standard calling convention
* __stdcall referred to as the Pascal calling convention
Calling conventions define 1) how arguments are placed on the stack, and 2) which entity (the caller, or the callee) is responsible for returning the call stack to its previous state when the routine has completed. These two methods are NOT compatible. Therefore if you have a routine in a DLL you wish to call, one of the first things to find out about it is which calling convention it expects. DLL routines that use the `_cdecl' calling convention require the use of the '''dll32''' sub-language option. For `__stdcall', use the '''dllwin32''' sub-language option. Here is an example:
<code>
my_cdecl_routine (a: INTEGER): POINTER
-- Encapsulation of a dll function with the `_cdecl' call mechanism.
external
"C [dll32 %"my_cdecl_dll.dll%"] (int): EIF_POINTER"
end
my_stdcall_routine (a: INTEGER): POINTER
-- Encapsulation of a dll function with the `_stdcall' call mechanism.
external
"C [dllwin32 %"my_stdcall_dll.dll%"] (int): EIF_POINTER"
end
</code>
{{note|Most OS services provided by the Win32 API use the __stdcall calling convention.}}
{{warning|Using getting '''dll32''' and '''dllwin32''' reversed will cause your application to crash, because the call stack will be corrupted. For more information please read your C compiler documentation. }}