Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi was macht System.IsMultiThread genau? (https://www.delphipraxis.net/89476-macht-system-ismultithread-genau.html)

EWeiss 1. Apr 2007 11:12

Re: was macht System.IsMultiThread genau?
 
Liste der Anhänge anzeigen (Anzahl: 1)
ich versuchs nochmal
Mein problem BassVis läßt sich in der environment von D7 aus der dort erstellten EXE nicht debuggen bei anderen usern.
Bei mir funktioniert es seltsamer weise ohne probleme.

Was könnte dieses Problem verursachen.
Habe es schon mit System.IsMultiThread versucht da der Thread in BassVis mit Create und nicht mit Begin
erstellt wird.

Jemand noch ideen ?

Würd mich mal interessieren ob das bei euch auch der fall ist.
Hier das Archiv..

2 Delphi projekte .. Sonique und Winamp.
Es geht also um D7 nicht um Do6

Delphi-Quellcode:
procedure TfrmMain.GetPlugin;
var
  IntI : integer;

begin

  // clear plugin list
  PluginList.Clear;

  // create temp list for new list of vis
  flist := TStringList.Create;

  // find out vis plugins
  flist.CommaText := BASS_VIS_FindPlugins(PChar(PluginDir),
                                          BASS_VIS_FIND_WINAMP or
                                          BASS_VIS_FIND_RECURSIVE or
                                          BASS_VIS_FIND_COMMALIST);
Hier einen breakpoint setzen flist.CommaText :=
Dort soll angeblich der AV immer auftreten.

gruss Emil

OldGrumpy 1. Apr 2007 12:05

Re: was macht System.IsMultiThread genau?
 
Riecht für mich nach Problemen mit dem Memory Manager... Ich hab leider kein Delphi 7, sonst würd ich da mal reinschauen. Am Breakpoint in die CPU-Ansicht umschalten und dort drin dann Opcode für Opcode vorwärts, dann sollte klarer werden, was da passiert. So aus der Ferne ist das aber auch nur Spekulation. Wäre z.B. hilfreich wenn man den ganzen Meldungstext der AV hätte :)

EWeiss 1. Apr 2007 12:18

Re: was macht System.IsMultiThread genau?
 
Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:

Zitat von OldGrumpy
Riecht für mich nach Problemen mit dem Memory Manager... Ich hab leider kein Delphi 7, sonst würd ich da mal reinschauen. Am Breakpoint in die CPU-Ansicht umschalten und dort drin dann Opcode für Opcode vorwärts, dann sollte klarer werden, was da passiert. So aus der Ferne ist das aber auch nur Spekulation. Wäre z.B. hilfreich wenn man den ganzen Meldungstext der AV hätte :)

Hier .. aber so richtig was mit anfangen kann man auch nicht.
Da die Hintergrundinfos fehlen.
Einzigste was ich weiss das er den genannten Breakpoint gesetzt hat und dort der
Fehler dann auftritt.

Was ich noch weiss er benutzt 'madCodeHook'
ka was das ist .. hab mich nicht mit beschäftigt.

gruss Emil

EWeiss 2. Apr 2007 06:45

Re: was macht System.IsMultiThread genau?
 
Ich habe folgenden Fehler festgestellt.

In einer meiner Units befand sich unter implementation eine nicht mehr vorhandene eingebundene Unit.
Aufgefallen ist mir das nachdem ich versucht habe meine DLL unter D7 zu kompilieren.

Seltsamerweise hat D06 hier keinerlei Probleme gemeldet und trotzdem die DLL kompiliert.
Denke mal das irgendwo im System (Suchpfad von D06) projekten diese Unit von D06 noch gefunden
wurde und deshalb keine fehlermeldung kam.

Kann es unterumständen daran liegen das D7 diesen Fehler beim debuggen meldet?
Weil eine nicht vorhande UNIT in die kompilierte DLL mit eingebunden wurde ?

Sehr seltsam das ganze.

gruss Emil

SirThornberry 2. Apr 2007 07:07

Re: was macht System.IsMultiThread genau?
 
ist BASS_VIS_FindPlugins eine Funktion der DLL und gibt einen String zurück?

EWeiss 2. Apr 2007 07:11

Re: was macht System.IsMultiThread genau?
 
Zitat:

Zitat von SirThornberry
ist BASS_VIS_FindPlugins eine Funktion der DLL und gibt einen String zurück?

Delphi-Quellcode:
 // find out vis plugins
  flist.CommaText := BASS_VIS_FindPlugins(PChar(PluginDir),
                                          BASS_VIS_FIND_WINAMP or
                                          BASS_VIS_FIND_RECURSIVE or
                                          BASS_VIS_FIND_COMMALIST);
Ja.
Array string ',' als Delemiter deshalb flist.CommaText.

EDIT:
Aus der DLL

Delphi-Quellcode:
function BASS_VIS_FindPlugins(vispath: PChar; flags: DWORD): PChar; stdcall;
export

BASS_VIS_FindPlugins ' Delphi
BASS_VIS_FindPlugins name 'BASS_VIS_FindPlugins@8'; 'MSVC


gruss Emil

SirThornberry 2. Apr 2007 07:14

Re: was macht System.IsMultiThread genau?
 
d.h du arbeitest mit ShareMem? Nicht das in D2006 ShareMem incompatibel zu ShareMem von D7 geworden ist oder sich die Strings intern irgendwie geändert haben.
Du könntest versuchen ob der Fehler bei den Kunden auch kommt wenn du die DLL mit Delphi7 kompilierst. Oder ist das schon der Fall?

EWeiss 2. Apr 2007 07:18

Re: was macht System.IsMultiThread genau?
 
Zitat:

Zitat von SirThornberry
d.h du arbeitest mit ShareMem? Nicht das in D2006 ShareMem incompatibel zu ShareMem von D7 geworden ist oder sich die Strings intern irgendwie geändert haben.
Du könntest versuchen ob der Fehler bei den Kunden auch kommt wenn du die DLL mit Delphi7 kompilierst. Oder ist das schon der Fall?

habe oben nochmal editiert.

Nein eigentlich nicht.
Die Funktion befindet sich direkt in der *.dpr vielleicht verursacht dies das Problem
Kann ich mir aber eigentlich auch nicht vorstellen.

Delphi-Quellcode:
function BASS_VIS_FindPlugins(vispath: PChar; flags: DWORD): PChar; stdcall;
var
  fPath: PChar;
  i, z: Integer;
  Plugins: String;
  DllHandle: THandle;
  VisList: TStringList;
  sSonique, sWinamp, fRecursive: Boolean;

  procedure SearchDir(const dPath: String);
  var
    x: Integer;
    sRec: TSearchRec;
  begin
    if (sSonique) then
    begin
      x := FindFirst(dPath + '*.svp', faAnyFile, sRec);
      while (x = 0) do
      begin
        if (FileExists(dPath + sRec.Name)) then
          VisList.Add(dPath + sRec.Name);

        x := FindNext(sRec);
      end;
      FindClose(sRec);
      (* <-- START --> UltraPlayer vis *)
      x := FindFirst(dPath + '*.uvs', faAnyFile, sRec);
      while (x = 0) do
      begin
        if (FileExists(dPath + sRec.Name)) then
          VisList.Add(dPath + sRec.Name);

        x := FindNext(sRec);
      end;
      FindClose(sRec);
      (* <-- END --> UltraPlayer vis *)
    end
    else if (sWinamp) then
    if BassVisInit then
    begin
      x := FindFirst(dPath + '*.dll', faAnyFile, sRec);
      while (x = 0) do
      begin
        if (FileExists(dPath + sRec.Name)) then
          VisList.Add(dPath + sRec.Name);

        x := FindNext(sRec);
      end;
      FindClose(sRec);
    end else
     begin
       BassFuncs^.SetError(BASS_ERROR_INIT);
       exit;
    end;

    if (fRecursive) then
    begin
      x := FindFirst(dPath + '*.*', faAnyFile, sRec);
      while (x = 0) do
      begin
        if (sRec.Name <> '.') and (sRec.Name <> '..') and (DirectoryExists(dPath + sRec.Name)) then
          SearchDir(dPath + sRec.Name + '\');

        x := FindNext(sRec);
      end;
      FindClose(sRec);
    end;
  end;
begin
  Result := nil;

  if (((flags and BASS_VIS_FIND_SONIQUE) <> BASS_VIS_FIND_SONIQUE) and ((flags and BASS_VIS_FIND_WINAMP) <> BASS_VIS_FIND_WINAMP)) or
     (((flags and BASS_VIS_FIND_SONIQUE) = BASS_VIS_FIND_SONIQUE) and ((flags and BASS_VIS_FIND_WINAMP) = BASS_VIS_FIND_WINAMP)) then
  begin
    BassFuncs^.SetError(BASS_ERROR_ILLPARAM);
    Exit;
  end;

  if (FindPluginsPtr <> nil) then
    StrDispose(FindPluginsPtr);

  VisList := TStringList.Create;

  sSonique := ((flags and BASS_VIS_FIND_SONIQUE) = BASS_VIS_FIND_SONIQUE);
  sWinamp := ((flags and BASS_VIS_FIND_WINAMP) = BASS_VIS_FIND_WINAMP);
  fRecursive := ((flags and BASS_VIS_FIND_RECURSIVE) = BASS_VIS_FIND_RECURSIVE);

  fPath := StrAlloc(Length(StrPas(vispath)) + 2);
  StrCopy(fPath, vispath);
  if (fPath[Length(StrPas(fPath)) - 1] <> '\') then
    StrCat(fPath, '\');

  SearchDir(StrPas(fPath));

  StrDispose(fPath);

  if (VisList.Count = 0) then
  begin
    VisList.Free;

    BassFuncs^.SetError(BASS_OK);
    Exit;
  end;

  for i := VisList.Count - 1 downto 0 do
  begin
    SetCurrentDirectory(PChar(ExtractFileDir(VisList[i])+ #0));
    DllHandle := LoadLibrary(PChar(VisList[i]+ #0));

    if (DllHandle <> 0) then
    begin
      if (sSonique) and (GetProcAddress(DllHandle, 'QueryModule') = nil) then
        VisList.Delete(i)
      else if (sWinamp) and (GetProcAddress(DllHandle, 'winampVisGetHeader') = nil) then
        VisList.Delete(i);
    end
    else
      VisList.Delete(i);

    FreeLibrary(DllHandle);
  end;

  if ((flags and BASS_VIS_FIND_COMMALIST) = BASS_VIS_FIND_COMMALIST) then
  begin
    FindPluginsPtr := StrAlloc(Length(VisList.CommaText) + 1);
    StrPCopy(FindPluginsPtr, VisList.CommaText);
  end
  else
  begin
    z := 0;
    Plugins := '';

    for i := 0 to VisList.Count - 1 do
    begin
      z := z + Length(VisList[i]) + 1;
      Plugins := Plugins + VisList[i] + #0;
    end;
    Plugins := Plugins + #0;

    FindPluginsPtr := StrAlloc(z + 1);
    CopyMemory(FindPluginsPtr, PChar(Plugins), z + 1);
  end;

  VisList.Free;

  BassFuncs^.SetError(BASS_OK);
  Result := FindPluginsPtr;

end;
Zitat:

Du könntest versuchen ob der Fehler bei den Kunden auch kommt wenn du die DLL mit Delphi7 kompilierst. Oder ist das schon der Fall?[/
habs noch nicht getestet wäre aber eine möglichkeit das mal zu probieren.

Gruss Emil

EWeiss 2. Apr 2007 07:30

Re: was macht System.IsMultiThread genau?
 
Dll in D7 ist kleiner als die von D06 verstehe wer will.
Ganze 3Kbit

Gruss Emil

OldGrumpy 2. Apr 2007 09:18

Re: was macht System.IsMultiThread genau?
 
Wenn ich das richtig verstehe, ist ShareMem ja fuer PCHAR gar nicht notwendig sondern nur für die Stringtypen von Borland selber - ich hatte auch erst in die Richtung gedacht, sah dann aber das PCHAR. Wenn man in Delphi ein DLL-Projekt anlegt, stehen im vorgefertigten Kram entsprechende Kommentare...

Was das "habs zufällig bemerkt als ich die DLL nochmal kompilierte" angeht: Genau aus dem Grund hab ich mir zur Angewohnheit gemacht, mehrteilige Projekte immer in einer Projektgruppe zu halten und entsprechende Projektabhängigkeiten zu definieren. Die Zeit die man ggf. mehr fürs Kompilieren braucht, ist bei der Fehlersuche schnell wieder eingespart :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:19 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz