[на редкость примитивный вопрос] Языки с подключением dll

maggi14

Назовите, пожалуйста, популярные ЯП, позволяющие подключать сишные длл и работать с тамошними функциями. Динамическая линковка не интересует, зато интересует, как туда передавать указатели.
Желательно, с простейшими примерами, вроде следующего:


В Object Pascal (Borland Delphi 4.0) это делается так:
function imported_fun_F1(x: Integer; s: PChar): Boolean; external 'library.dll' name 'F1';


Желательно также получить подсказку, как:
а) передавать в эту функцию значения (числа);
б) как передавать туда указатели;
в) как передавать структуры;
г) что делать со строками (в библиотеке они все char*) - как в параметрах, так и в ретерне.
Интересуют, в первую очередь, Delphi и VB. От других языков тоже не откажусь

garikus

Компонентный паскаль / BlackBox
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.


> как туда передавать указатели
сейчас посмотрю..

maggi14

Большое спасибо. Честно говоря, популярные языки немного актуальнее , но чем больше - тем лучше.
Узнал теперь, что бывает такая штука - компонентный паскаль

garikus

Data types in interface modules
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
:-)

lenabarskaya

Visual Basic

sinet

FreePascal также как и в Delphi:


function CreateJobObject(lpJobAttributes: PSecurityAttributes;
lpName: PAnsiChar): THandle; stdcall;
external 'Kernel32.dll' name 'CreateJobObjectA';


Главное stdcall; указать.

krishtaf

и много ты пишешь на Oberone ?
Блакбокс у тебя какой - шароварный ?

Vladislav177Rus

Visual Basic
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

Всем спасибо
Оставить комментарий
Имя или ник:
Комментарий: