[на редкость примитивный вопрос] Языки с подключением dll
BlackBox
static:
dymanic:
> как туда передавать указатели
сейчас посмотрю..
Компонентный паскаль / static:
MODULE Epse21Dll0Interface ["c:\!\anyname.dll"];
PROCEDURE Add* ( a, b: INTEGER ): INTEGER;
END Epse21Dll0Interface.
MODULE Epse21Dll0Test;
IMPORT StdLog, Dll := Epse21Dll0Interface;
PROCEDURE Do*;
VAR a, b: INTEGER;
BEGIN
a := 1;
FOR b := 0 TO 1000 DO
a := Dll.Add( a, b )
END;
StdLog.Int( a ); StdLog.Ln
END Do;
END Epse21Dll0Test.
dymanic:
MODULE Epse21DllDyn0;
IMPORT SYSTEM, WinApi, Log := StdLog;
TYPE ProcType = PROCEDURE ( a, b: INTEGER ): INTEGER;
PROCEDURE Do*;
VAR
dll: WinApi.HINSTANCE;
MyProc: ProcType;
a, b, c, res: INTEGER;
BEGIN
(* loading the DLL: *)
dll := WinApi.LoadLibrary( "anyname.dll" );
ASSERT( dll # 0, 100 );
(* getting access to the needed function: *)
MyProc := SYSTEM.VAL( ProcType, WinApi.GetProcAddress( dll, "Add" ) );
(* working with the function: *)
a := 1; b := 3;
c := MyProc( a, b );
Log.Int( a ); Log.Int( b ); Log.Int( c ); Log.Ln;
(* unloading the DLL: *)
res := WinApi.FreeLibrary( dll )
END Do;
END Epse21DllDyn0.
> как туда передавать указатели
сейчас посмотрю..
Узнал теперь, что бывает такая штука - компонентный паскаль
Always use untagged records as replacements for C structures, in order to avoid the allocation of a type tag for the garbage collector. The system flag [untagged] marks a type as untagged (no type information is available at run-time) with standard alignment rules for record fields (2-byte fields are aligned to 2-byte boundaries, 4-byte or larger fields to 4-byte boundaries). The system flags [noalign], [align2], and [align8] also identify untagged types but with different alignments for record fields.
Like all system flags, "untagged" can only be used if module SYSTEM is imported.
Example:
RECORD [noalign] (* untagged, size = 7 bytes *)
c: SHORTCHAR; (* offset 0, size = 1 byte *)
x: INTEGER; (* offset 1 , size = 4 bytes *)
i: SHORTINT (* offset 5, size = 2 bytes *)
END
Procedures
Component Pascal procedure calls conform to the StdCall calling convention (parameters pushed from right to left, removed by called procedure). If the CCall convention (parameters removed by caller) is needed for some DLL procedures, the corresponding procedure declaration in the interface module must be decorated with the [ccall] system flag.
No special handling is required for callback procedures.
For parameters of type POINTER TO T it is often better to use a variable parameter of type T rather than to declare a corresponding pointer type. Declare the VAR parameter with sytem flag [nil] if NIL must be accepted as legal actual parameter.
Example:
C:
BOOL MoveToEx(HDC hdc, int X, int Y, LPPOINT lpPoint)
Component Pascal:
PROCEDURE MoveToEx* (dc: Handle; x, y: INTEGER; VAR [nil] old: Point): Bool
Correspondence between Component Pascal and C data types
unsigned char = SHORTCHAR (1 byte)
WCHAR = CHAR (2 bytes)
signed char = BYTE (1 byte)
short = SHORTINT (2 bytes)
int = INTEGER (4 bytes)
long = INTEGER (4 bytes)
LARGE_INTEGER = LONGINT (8 bytes)
float = SHORTREAL (4 bytes)
double = REAL (8 bytes)
Note that Bool is not a data type in C but is defined as int (= INTEGER). 0 and 1 must be used for assignments of FALSE and TRUE and comparisons with 0 have to be used in conditional statements (IF b # 0 THEN ... END instead of IF b THEN ... END).
Note that it is not possible to unload a DLL from within BlackBox. To avoid having to exit and restart your development environment repeatedly, it is a good idea to test the DLL that you are developing from within another instance of the BlackBox application.
© Project EPSE-21, http://cern.ch/epse21/, 2004
:-)
Visual Basic
function CreateJobObject(lpJobAttributes: PSecurityAttributes;
lpName: PAnsiChar): THandle; stdcall;
external 'Kernel32.dll' name 'CreateJobObjectA';
Главное stdcall; указать.
Блакбокс у тебя какой - шароварный ?
Private Function MessageBox Alias "MessageBoxA" Lib "user32.dll" (ByVal hWnd As Long, ByVal szCaption As String, ByVal szText As String, ByVal DlgType As Long) As Long
Указатели передаются с помощью ByRef, строки в любом случае передаются по указателю, но с ByRef (по умолчанию) передается указатель на BSTR (так это, вроде, называется а при ByVal строка сперва преобразуется к zero-terminated виду.
Всем спасибо
Оставить комментарий
maggi14
Назовите, пожалуйста, популярные ЯП, позволяющие подключать сишные длл и работать с тамошними функциями. Динамическая линковка не интересует, зато интересует, как туда передавать указатели.Желательно, с простейшими примерами, вроде следующего:
Желательно также получить подсказку, как:
а) передавать в эту функцию значения (числа);
б) как передавать туда указатели;
в) как передавать структуры;
г) что делать со строками (в библиотеке они все char*) - как в параметрах, так и в ретерне.
Интересуют, в первую очередь, Delphi и VB. От других языков тоже не откажусь