Source file: /~heha/BETA/matdde7.zip/SRC/dde_init.pas

unit dde_init;
{Interface für exportierte DDEINIT-Routinen, zur Benutzung durch
 alle anderen DDE-DLLs}
interface
uses PasMex32,Windows,DDEML;
const
 StdTimeOut=3000;		{3 Sekunden TimeOut für alles}
 MaxAdvItems=16;
{$Z4}
type
 EClip=(Text,Unicode,XlTable,MatTable);
 PHSZ=^HSZ;

function GetInst:DWord; stdcall;
{ID-Spender für die anderen Funktionen}
procedure HandleDdeError(DdeError:UInt); stdcall;
{Bei DDE-Fehler Warnmeldung (kein Skript-Abbruch!);
 DdeError darf auch 0 sein; dann wird DdeGetLastError herangezogen}
function TestInputArgs(nrhs:LongInt; const prhs: TMatArr;
  minIn,maxIn:LongInt; permitString,permitNumeric: DWord):Boolean; stdcall;
{Testet Rechte-Hand-Parameter auf Anzahl (Minimum und Maximum)
 und auf Typ via zweier Bitmasken (so sind auch zwei Typen erlaubt)
 Liefert immer TRUE, weil bei Fehler Skript-Abbruch}
function ArrayToStringHandle(a:PArray):Hsz; stdcall;
{Umwandlung Matlab-String-Matrix in DDE-String-Handle}
function ArrayToStringHandles(a:PArray;szp:PHSZ;szplen:Integer):Integer;
  stdcall;
{Umwandlung Matlab-String-Matrix in DDE-String-Handle-Array}
function FreeStringHandle(sz:HSZ):Boolean; stdcall;
{ein oder mehrere String-Handles freigeben und Referenzen nullsetzen}
function CheckClipFormat(a:PArray; var cf:UInt; ocp:PBool):EClip; stdcall;
{Testet auf CF_Text(=1) oder CF_XlTable oder CF_MatTable
 und liefert 1, 2 oder 3; bei Fehler keine Rückkehr
 Verarbeitet sowohl Zahlen als auch (neu) Konstanten-Strings
 Bei Angabe des Parameters ocp wird auf Zwei-Element-Array getestet,
 für DDEREQ und DDEADV, und so der Rückgabe-Typ ermittelt}
procedure PutErr(strcode:UInt); stdcall;
{einfache Fehlermeldung}
procedure PutWarn(strcode:UInt); stdcall;
{einfache Warnung für die anderen DLLs}
function MyRegisterClipboardFormat(FormatName:PChar):UInt; stdcall;
{wie die Windows-Funktion, jedoch mit Verarbeitung von "Text" und
 "UnicodeText" als vordefinierte Codes}
const
 NumberLength=26;	{Länge eines DOUBLE in Zeichen, volle Präzision}
function Alloc_Datalen(format:EClip; x,y:LongInt; var datalen: UInt):PChar;
  stdcall;
{Berechnet die benötigte Menge an Speicherplatz für die angegebenen
 Dimensionen und fordert ihn an. Nur für max. zweidimensionales!
 Liefert nie NIL; bricht ggf. mit mexErrMsgTxt() ab.
 Speicher ist mit Nullen gefüllt}
procedure str_count_numbers(s:PChar; var x,y:LongInt); stdcall;
{Zählt Zeilen (y) und Spalten (x) der Text-Matrix ab, nimmt dabei
 das Maximum, falls einige Zeilen nicht voll sind. Trennt Spalten
 an Leerzeichen, Tabs und am Windows-Listentrenner? (Systemsteuerung).
 Leerzeilen werden ignoriert. X mindestens 1, aber Y kann Null werden!}
procedure str_to_numbers(s:PChar; x,y:LongInt; dp:PDouble;
  skipxl:Bool); stdcall;
{wandelt durchgezählten Text in Doubles um}
procedure str_from_numbers(s:PChar; x,y:LongInt; dp:PDouble;
  skipxl:Bool); stdcall;
{wandelt Doubles in Text um}
procedure PrepareXlTable(var dp:PDouble; x,y: LongInt); stdcall;
{Füllt den bereits ausgenullten Speicher mit dem Header und den
 Zwischen-Headern, setzt dp hinter den Haupt-Header}
function SkipXlFloatHeader(var dp:PDouble):LongInt; stdcall;
{überspringt genau einen Zwischen-Header und liefert die Blocklänge
 in Doubles; hoffentlich ist die Blocklänge durch 8 teilbar}
function DdeDataToArray(hindata:HDdeData; format:EClip; outchar: Bool):
  PArray; stdcall;
{gemeinsame Routine für DDEREQ und DDEADV,
 wandelt DDE-Daten aus Handle in Matlab-Array um}

procedure mxGetStringW(a:PArray; sp:PWChar; buflen:LongInt); stdcall;
{Unicodes aus Matlab-Array herausziehen, buflen in BYTES}
function mxCreateStringW(sp:PWChar):PArray; stdcall;
{Unicodes in neues Matlab-Array einsetzen}

procedure advNewInfo(conv:HConv; item:Hsz; cf:UInt; format:EClip;
  outchar:Bool; arrayname,evalstring: PChar); stdcall;
{Neuanlage eines Listenelements; evtl. vorher vorhandenes entfernen.
 Parameter-Reihenfolge und stdcall ermöglicht Speicher-Kopie}
procedure advDeleteInfo(conv:HConv; item:Hsz; cf:UInt); stdcall;
{Löscht die Daten aus der einfach verketteten Liste;
 der Aufruf mit allen drei Parametern =0 löscht alles.
 Die zugehörigen String-Handles werden freigegeben.
 Falls "multithreadend", müsste das Zeug in einen kritischen Abschnitt}
implementation
function  GetInst;			external 'ddeinit.mexw32' index 11;
procedure HandleDdeError;		external 'ddeinit.mexw32' index 12;
function  TestInputArgs;		external 'ddeinit.mexw32' index 13;
function  ArrayToStringHandle;		external 'ddeinit.mexw32' index 14;
function  CheckClipFormat;		external 'ddeinit.mexw32' index 15;
procedure PutErr;			external 'ddeinit.mexw32' index 16;
procedure PutWarn;			external 'ddeinit.mexw32' index 17;
function  MyRegisterClipboardFormat;	external 'ddeinit.mexw32' index 18;
function  ArrayToStringHandles;		external 'ddeinit.mexw32' index 19;
function  FreeStringHandle;		external 'ddeinit.mexw32' index 20;

function  Alloc_Datalen;		external 'ddeinit.mexw32' index 21;
procedure str_count_numbers;		external 'ddeinit.mexw32' index 22;
procedure str_to_numbers;		external 'ddeinit.mexw32' index 23;
procedure str_from_numbers;		external 'ddeinit.mexw32' index 24;
procedure PrepareXlTable;		external 'ddeinit.mexw32' index 25;
function  SkipXlFloatHeader;		external 'ddeinit.mexw32' index 26;
function  DdeDataToArray;		external 'ddeinit.mexw32' index 27;

procedure mxGetStringW;			external 'ddeinit.mexw32' index 31;
function  mxCreateStringW;		external 'ddeinit.mexw32' index 32;

procedure advNewInfo;			external 'ddeinit.mexw32' index 41;
procedure advDeleteInfo;		external 'ddeinit.mexw32' index 42;
end.
Detected encoding: OEM (CP437)1
Wrong umlauts? - Assume file is ANSI (CP1252) encoded