
Spielmann, ct 9/97, S.310

Es gibt eine 16-Bit-Version von MMSystem.DLL, die zur Untersttzung 
von Real-Mode-Soundtreibern mit physischen Adressen arbeitet und deshalb 
Rckruffunktionen nur in FIXED-Segmenten zult. Fr die 16-Bit-Variante 
der Unit ASPlayer sind deshalb zwei Ergnzungen notwendig: Die Linker-Anweisung 
{$C PERMANENT} am Anfang der Datei sowie die Sperre des Segments gegen Verschiebungen. 
 Da der Lader von Windows 3.1x die Anweisung {$C FIXED} in Anwendungsprogrammen effektiv 
ignoriert und die fragliche Variante von MMSystem eine Prfung ber GetCodeInfo benutzt, 
sind hier zwei Schritte notwendig: Das Fixieren des Segments ber GlobalFix und das 
(hchst regelwidrige) Ausknipsen des Bits moveable" in der Modul-Datenbank. Fgen Sie 
am Ende der Unit die folgenden Zeilen ein:

*** Listing ***
{$IFNDEF WIN32}
procedure SetSegFixed(CodeSeg: Word);
type WordAry =  Array[0..30] of Word;
var P: ^WordAry; ModCount, x: Integer;
begin
  GlobalFix(CodeSeg); { echte Fixierung }
  if Swap(LoWord(GetVersion)) > $0311 
        then Exit;  { nur Win 3.1x }
  P := GlobalLock(GetModule-
          Handle(Ptr(0,hInstance)));
  ModCount := P^[14];
  P := Ptr(Seg(P^),P^[17]);
  for x := 1 to ModCount do
    if P^[4] = CodeSeg-1 then
    begin  { Flag "moveable" raus }
      P^[2] := P^[2] and not $10; Break;
    end  { nchster Eintrag }
     else Inc(LongInt(P),10);  
end;

initialization
  SetSegFixed(CSeg); { Segment fixieren }
{$ENDIF}

*** Listing ***

