%CALLDLL Universal calling of all routines contained in DLLs (16 bit)
% {retval=}CallDll('{DLL-Name:}Funktions-Name{ Prototyp}',...)
% Der erste Parameter bestimmt DLL-Name, Funktions-Name
% und Funktions-Prototyp (Typen der Parameter),
% die übrigen Parameter entsprechen den zu übergebenden
% Argumenten.
%
% DLL-Name
%	Name der DLL, ggf. mit Pfadangabe,
%	Erweiterung .DLL kann weggelassen,
%	sonstige Erweiterungen müssen angegeben werden.
%	Wird DLL-Name weggelassen, wird die zuletzt
%	aufgerufene DLL verwendet.
%	Wird DLL-Name angegeben, wird die vorhergehende
%	herausgeworfen und (ggf. dieselbe!) neu geladen
%	Am Anfang ist USER(.EXE) als DLL geladen.
% Funktions-Name
%	Name der Funktion in der DLL
%	Kann auch eine Zahl (numerischer Index) sein.
%	Hexadezimale Zahlenangabe bitte mit Präfix '$'.
% Prototyp
%	Nach einem Leerzeichen wird die Liste mit den Typen
%	der Argumente angegeben. Allgemeine Syntax:
%	{typ=}{typ{,typ{,...}}}   ({typ=} ist Rückgabewert)
% typ
%	Prototyp eines Einzelarguments. Allgemeine Syntax
%	{*}t{[{size}]}
%    * verwendet Zeiger auf Datentyp t
%	Die Anzahl der Elemente im Array richtet sich nach
%	der Größe des Matlab-Arrays
%    t Basisdatentyp:
%		h oder i08	Short-Integer	vzb. 8 bit
%		i oder i16	Integer		vzb. 16 bit
%		l oder i32	Long-Integer	vzb. 32 bit
%		c oder u08	Byte		vzl. 8 bit
%		u oder u16	Word		vzl. 16 bit
%		w oder u32	DWord		vzl. 32 bit
%		f oder f32	Single		Gleitk. 32 bit
%		g oder f64	Double		Gleitk. 64 bit
%		s oder str	Zeichenkette	ASCIIZ
%	Groß/Kleinschreibung ist nicht von Belang
%	s ist stets ein Zeiger
%    [] verwendet Zeiger auf Datentyp t (wie *)
%	UND macht eine Rückkonvertierung des Puffers zurück
%	zur angegebenen Matlab-Variable. (Der zugeordnete
%	Parameter MUSS eine Variable sein.)
%	Die Dimension (Zeilen, Spalten) wird nicht geändert.
%    [size] Zeiger auf Datentyp t mit Rückgabe (wie [])
%	Die Anzahl der Elemente ist hierbei <size> Elemente.
%	Die zurückgegebene Matrix ist ein Zeilenvektor,
%	sofern sich <size> von der Größe (m*n) der Matrix
%	unterscheidet. Die Angabe von <size> ist für t=str
%	wirkungslos.
%
%	Ohne Angabe von <Prototyp> oder einzelner <typ>
%	werden diese intern anhand der Argumente "erraten":
% Numerischer Skalar: Integer (i16)
% Numerischer Vektor/Matrix: (Zeiger auf) Integer-Array (*i16)
% String: (Zeiger auf) nullterminierte Zeichenkette (str)
%
% Beispiel1:	Simple Meldung als erster Aufruf von CallDll
% calldll('messagebox',0,'Hallo Welt!','Matlab',0)
%	korrekter:
% calldll('user:messagebox',calldll('cmex:hwndmatlabcmd'),...
%   'Hallo Welt!','Matlab',0)
%
% Beispiel2:	Abfragen der Teiler für NI-DAQ-Meßkarte
% x=1; y=1;
% calldll('nidaq:wfm_rate f64,i16,i16[1],u32[1]',1200,0,x,y)
% x,y
%
% Einschränkungen von CallDll:
% Aufrufe mit Callback sind nicht möglich
% Aufruf nur von Funktionen mit Pascal-Aufrufkonvention
%
% h#s 01/00

% Test
cd mex
cd orandxor
x=1; y=1;
calldll('nidaq:wfm_rate f64,i16,i16[1],u32[1]',1200,0,x,y)
x,y
clear mex

w=calldll('cmex:hwndMatlabCmd')

