Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Dll-Zuweisung (https://www.delphipraxis.net/206141-dll-zuweisung.html)

JWollenberg 23. Nov 2020 10:06

Dll-Zuweisung
 
Hallo Leute,

ich stehe etwas auf dem Schlauch, wie spreche ich die scrrun.dll an, damit dieser Quelltext (nicht von mir, ist aus dem Netz: https://www.delphi-treff.de/tipps-tr...e-cd-ram-disk/) funktioniert.

Quelltext:

Delphi-Quellcode:
procedure GetDrives(const AItems: TStrings);
const
  DriveTypeTexts: array[DRIVE_UNKNOWN..DRIVE_RAMDISK] of string =
   ('Unbekannt', 'Kein Wurzelverzeichnis', 'Diskette', 'Festplatte', 'Netzlaufwerk', 'CDROM', 'RAMDisk');
var
  Drive: Char;
  DriveType: Integer;
  DriveMask: Integer;
  Flag: Integer;
begin
  DriveMask := GetLogicalDrives; //Bitmaske holen
  flag := 1; //Startflag setzen
  for Drive := 'A' to 'Z' do //Jeden Buchstaben gegenprüfen
  begin
    if (flag and DriveMask) 0 then
    begin
      DriveType := GetDriveType(PChar(Format('%S:',[Drive]) ) ) ;
      AItems.Add(Format('%s: %s', [Drive, DriveTypeTexts[DriveType]]));
    end;
    flag := flag shl 1; //Ein Bit weiter nach links gehen ( = flag * 2)
  end;
end;
Vielen Dank im Voraus!
MfG Jürgen

TiGü 23. Nov 2020 10:11

AW: Dll-Zuweisung
 
1. Schon im Original-Link fehlt das Gleichheitszeichen in der if-Abfrage und der Vergleich darf nicht mit 0 sondern muss mit flag geschehen!
Aus
Delphi-Quellcode:
if (flag and DriveMask) 0 then
muss also
Delphi-Quellcode:
if (flag and DriveMask) = flag then
werden.

2. Was hat diese Funktion mit dem Windows Scripting Host (scrrun.dll) zu tun?

EDIT: If-Abfrage geändert

JWollenberg 23. Nov 2020 10:32

AW: Dll-Zuweisung
 
1. Danke

2. Diese Funktion
Delphi-Quellcode:
GetDriveType(PChar(Format('%S:',[Drive]) ) )
nutzt doch die scrrun.dll im Windows-Verzeichnis SysWOW64.

Oder liege ich hier falsch?

Ich bin dankbar für jeden Tipp!

Dalai 23. Nov 2020 10:37

AW: Dll-Zuweisung
 
Zitat:

Zitat von JWollenberg (Beitrag 1477757)
2. Diese Funktion
Delphi-Quellcode:
GetDriveType(PChar(Format('%S:',[Drive]) ) )
nutzt doch die scrrun.dll im Windows-Verzeichnis SysWOW64.

Nein, tut sie nicht. Wenn du nicht weißt, aus welcher DLL eine Funktion kommt, aber bereits bekannt ist, dass es eine Win32 API Funktion ist, bietet es sich an, im MSDN nach dem Namen dieser Funktion zu suchen: MSDN-Library durchsuchenGetDriveType. In (nahezu) jedem Artikel steht ganz unten in den Requirements, aus welcher DLL die Funktion kommt, in diesem Fall kernel32.dll.

[EDIT]
Wenn man ein Delphi mit Quelltext hat, kann man natürlich auch direkt nachschauen, z.B. per Strg+Klick, wie TiGü auch im folgenden Beitrag anmerkt.
[/EDIT]

Grüße
Dalai

TiGü 23. Nov 2020 10:44

AW: Dll-Zuweisung
 
Ich bin ein großer Freund des Strg + linker Mausklick, was uns in Zeile 37432 der Winapi.Windows.pas führt:
Delphi-Quellcode:
function GetDriveType; external kernelbase name 'GetDriveTypeW';


Ein weiterer Strg + linker Mausklick auf kernelbase bringt uns in Zeile 36253, wo die Definition der Konstante steht:
Delphi-Quellcode:
kernelbase = 'kernel32.dll';

JWollenberg 24. Nov 2020 07:55

AW: Dll-Zuweisung
 
Danke für die schnelle Hilfe, hat funktioniert, dennoch würde mich der Ansatz mit scrrun.dll interessieren. Ich hoffe es macht keine große Mühe.

MfG Jürgen

TiGü 24. Nov 2020 09:08

AW: Dll-Zuweisung
 
Zitat:

Zitat von JWollenberg (Beitrag 1477818)
Danke für die schnelle Hilfe, hat funktioniert, dennoch würde mich der Ansatz mit scrrun.dll interessieren. Ich hoffe es macht keine große Mühe.

Nochmal die Frage: Wie kommst du auf die scrrun.dll? Wo ist der Bezug? Was für ein Ansatz?
Bitte erläutern!

JWollenberg 24. Nov 2020 09:35

AW: Dll-Zuweisung
 
Der Bezug ist folgender: Z.Z. experimentiere ich mit einer RAM-Disk (statt SSD) herum. Ich habe 2 RAM-Disks wobei die zweite zum Probieren fungiert. Bei der Suche im Netz bin ich dann auf die scrrun.dll gestoßen, deshalb. Zuerst wollte ich das mit ein Powershell-Script lösen, wobei ich zu keinem Ergebnis gekommen bin, wobei ich sagen möchte, dass ich ein Anfänger in Richtung PS-Script bin.

TiGü 24. Nov 2020 10:21

AW: Dll-Zuweisung
 
Zitat:

Bei der Suche im Netz bin ich dann auf die scrrun.dll gestoßen, deshalb
Zeig mir bitte mal die Fundstelle.
Sehe den Bezug nämlich immer noch nicht.
Vor allen nicht mit der Delphi-Funktion von delphi-treff.de.

Powershell ist sehr mächtig und wahrscheinlich gut geeignet für dein Problem: Herauszufinden was genau sich hinter dem jeweiligen Laufwerksbuchstaben verbirgt.
Hier wäre eine weitere Beschäftigung mit dem Thema angebracht.
Es gibt unzählige Videos, Tutorials, Blogs, Bücher und alte mesopotamische Tontäfelchen dazu.
Bitte schlau googlen!

Wahrscheinlich wäre ein
Code:
Get-Volume | Select-Object DriveLetter, DriveType
oder
Code:
Get-CimInstance Win32_LogicalDisk | Select-Object DeviceID, DriveType
schon genau das, was du suchst.
Den Teil hinter dem Pipe-Operator | kannst du auch weglassen, um zu sehen welche Eigenschaften da noch angezeigt werden.

Dalai 24. Nov 2020 11:17

AW: Dll-Zuweisung
 
Ei, da läuft ja einiges durcheinander. PowerShell hat mit der scrrun.dll nichts zu tun, denn diese DLL kommt vom bzw. ist für den Windows Script Host (WSH). Normalerweise benutzt man selbigen in Verbindung mit VBS Skripten (durch cscript.exe/wscript.exe).

Die Problemstellung hat weder mit der DLL noch mit der PowerShell zu tun. Vielleicht wäre es gut, wenn du darlegen könntest, was du eigentlich vorhast. Für mich sieht es so aus, als wolltest du rausfinden, ob ein Laufwerk eine RAM-Disk ist. Das ist mit PowerShell, WSH und jeder Programmiersprache möglich.

Grüße
Dalai

himitsu 24. Nov 2020 12:15

AW: Dll-Zuweisung
 
Indirekt hat der schon bissl was damit zu tun.

Der Windows Script Host (WSH) kann aktuell standardmäßig VisualBasic- (VBS), JavaScript- (JS) und PowerShell-Scripte ausführen,
über die Console (wscript.exe bzw. cscript.exe) oder via API (DLL).
Und man kann dort auch nich weitere Script-Sprachen registrieren. (sogar PascalScript gibt es)

Wobei man PowerShell auch direkt auswühren kann (powershell.exe) und den WSH garnicht bräuchte.



Hier sind praktisch paar Dinge gemischt, welche nichtmal alle für das eigentlich Problem nötig sind.
* Laufwerke suchen ... Win32-API, PowerShell, WMI oder sonstwo
* ein PowerShellScript ausführen und dort nach Laufwerken suchen
* ein PowerShellScript im WindowsScriptingHost ausführen



Zitat:

Zitat von TiGü (Beitrag 1477756)
1. Schon im Original-Link fehlt das Gleichheitszeichen in der if-Abfrage und der Vergleich darf nicht mit 0 sondern muss mit flag geschehen!
Aus
Delphi-Quellcode:
if (flag and DriveMask) 0 then
muss also
Delphi-Quellcode:
if (flag and DriveMask) = flag then
werden.

Wobei hier nicht das
Delphi-Quellcode:
=
fehlte, denn die sind alle vorhanden.
Es fehlte das
Delphi-Quellcode:
<>
, da irgendwann diese HTML-Zeichen verschwunden sind. :zwinker:

JWollenberg 25. Nov 2020 09:00

AW: Dll-Zuweisung
 
Hallo Leute,

1.
Zitat:

Zeig mir bitte mal die Fundstelle...
Habe ich vergessen :? Entschuldige, es ist nicht einfach sich in andere Denkmodelle hinein zu versetzen, wie ich weiter oben schon erläutert habe, brauche ich die Funktion um mit einer RAM-Disk zu arbeiten, das wiederum benötige ich für die Arbeit mit Dateien, dh. Schreib-Lese-Vorgänge, und da ich mindestens 2 RAM-Disks (manchmal auch mehr) zu laufen habe, möchte ich die Auswahl automatisieren.

2.
Zitat:

Wahrscheinlich wäre ein...
Leider wird mir hier keine RAM-Disk angezeigt.

3.
Zitat:

Die Problemstellung hat weder mit...
Genau, das wäre mein Wunsch, es wäre gut zu schreiben wie und nicht das es geht

Aber trotzdem Danke für eure Mühe!

Falls jemand noch eine greifende Idee habe sollte, wäre ich sehr dankbar.

TiGü 25. Nov 2020 09:23

AW: Dll-Zuweisung
 
Zitat:

Zitat von JWollenberg (Beitrag 1477918)
2.
Zitat:

Wahrscheinlich wäre ein...
Leider wird mir hier keine RAM-Disk angezeigt.

Aber trotzdem Danke für eure Mühe!

Falls jemand noch eine greifende Idee habe sollte, wäre ich sehr dankbar.

Auch bei Get-CimInstance Win32_LogicalDisk | Select-Object DeviceID, DriveType nicht?

Bei mir kommt sowas bei rum:

Code:
DeviceID DriveType
-------- ---------
C:              3
D:              3
E:              5
M:              4
N:              4
R:              3
S:              4
Wobei bei mir R: die RAM-Disk ist. Diese ist mit "SoftPerfect RAM Disk" in Version 3.4.7 angelegt, 2048 MB groß und mit FAT32 formatiert.

Gemäß https://docs.microsoft.com/de-de/dot...m.io.drivetype ist 3 eine Festplatte und eine 6 wäre ein RAM-Datenträger.
Es ist aber soweit nicht verwunderlich, dass hier 3 anstatt 6 angezeigt wird, weil das Programm gegenüber Windows per Treiber eine richtige Festplatte emuliert.

Soll heißen: Je nachdem, wie und womit die RAM-Disk angelegt wurde, besteht keine Möglichkeit programmatisch herauszufinden, ob es nun eine richtige Festplatte/SSD zum Anfassen ist oder eine RAM-Disk.
Das ist immer abhängig davon, wie und was der jeweilige "Treiber" dafür an WinAPI-Funktionen und/oder Powershell zurückmeldet.

TiGü 25. Nov 2020 09:35

AW: Dll-Zuweisung
 
Als Notbehelf wäre vielleicht möglich, anhand der Größe zu entscheiden, da eine RAM-Disk ja selten die Kapazität einer modernen Festplatte hat:

Code:
Clear
$ConversionFactor = 1024 * 1024 * 1024;
$MaxSizeInGigaBytes = 2 * $ConversionFactor  
$MinSizeInGigaBytes = 0.1 * $ConversionFactor                
Get-CimInstance Win32_LogicalDisk | Where-Object Size -lt $MaxSizeInGigaBytes | Where-Object Size -gt $MinSizeInGigaBytes
Kann man ggf. noch geschickter formulieren.

JWollenberg 25. Nov 2020 09:50

AW: Dll-Zuweisung
 
Liste der Anhänge anzeigen (Anzahl: 3)
Also bei mir sieht es so aus:

Laufwerk001.gif - sind meine Laufwerke
Laufwerk002.gif - ausgeführtes PS-Script
Laufwerk003.gif - das Ergebnis

Wie man sieht wird keine RAM-Disk spezifiziert. Darum war meine Idee, dies mit einem Delhpi-Programm zu erledigen. Übrigens wird beim vorgezeigtem Quellcode auch keine RAM-Disk angezeigt.

Nun ist eure Kompetenz gefragt!

Danke im Voraus!

TiGü 25. Nov 2020 10:12

AW: Dll-Zuweisung
 
Zitat:

Zitat von JWollenberg (Beitrag 1477924)
Nun ist eure Kompetenz gefragt!

Zitat:

Zitat von Ich
Je nachdem, wie und womit die RAM-Disk angelegt wurde, besteht keine Möglichkeit programmatisch herauszufinden, ob es nun eine richtige Festplatte/SSD zum Anfassen ist oder eine RAM-Disk.
Das ist immer abhängig davon, wie und was der jeweilige "Treiber" dafür an WinAPI-Funktionen und/oder Powershell zurückmeldet.

Lösung: Wenn es kein Flag gibt, musst du über Umwege herausbekommen, ob das Laufwerk eine RAM-Disk ist. Die Größe wäre ein Indikator. Vgl. mit Beitrag #14.

JWollenberg 25. Nov 2020 17:01

AW: Dll-Zuweisung
 
Hallo Leute, erst einmal Danke für eure Mühe, dh. ich werde weiter nach einer Lösung suchen. Wenn jemand noch eine zündende Idee parat hat, so möge er sie mir aufzeigen.

MfG Jürgen

himitsu 25. Nov 2020 17:08

AW: Dll-Zuweisung
 
Bzw. wenn das Flag hier falsch ist, weil scheinbar jemand den Treiber schrottig programmiert hat.
* besserer RAMDrive-Triber
* oder eben irgendwie anders ermitteln

Sinspin 25. Nov 2020 17:38

AW: Dll-Zuweisung
 
Hallo,

wie legst du die RAM-Disk denn an? Da wird kein Name oder eine Id zurückgegeben? Kannst du nicht nach dem erstellen eine Datei auf Root der Disk anlegen die eine bestimmte UID als Name hat?
Dann kannst du einfach die liste der Laufwerke durchsuchen und nachsehen welches diese Datei hat.

Wozu brachst du die RAM-Disk(s) eigentlich? Vieleicht gibt es anderen Lösungen.

Zitat:

Zitat von JWollenberg (Beitrag 1477924)
Nun ist eure Kompetenz gefragt!

Das finde ich doch schon ein bisschen frech!

JWollenberg 25. Nov 2020 17:42

AW: Dll-Zuweisung
 
Danke, ich werde sehen. Die RAM-Disk kommt von OSFMount. https://www.osforensics.com/tools/mo...sk-images.html
Dieses Programm lässt sich gut in Scripten verwenden.

Entschuldigung, ich wollte keinen zu Nahe treten.

Mit einer ID ist eine Option, danke.

himitsu 25. Nov 2020 18:26

AW: Dll-Zuweisung
 
Also ist das zwar ein RAMDrive, aber es tut so, als sei es eine Festplatte/Datenträger ... na dann stimmt der DriveType ja "eigentlich" schon irgendwie.

TiGü 26. Nov 2020 07:55

AW: Dll-Zuweisung
 
Zitat:

Zitat von TiGü (Beitrag 1477923)
Als Notbehelf wäre vielleicht möglich, anhand der Größe zu entscheiden, da eine RAM-Disk ja selten die Kapazität einer modernen Festplatte hat:

Code:
Clear
$ConversionFactor = 1024 * 1024 * 1024;
$MaxSizeInGigaBytes = 2 * $ConversionFactor  
$MinSizeInGigaBytes = 0.1 * $ConversionFactor                
Get-CimInstance Win32_LogicalDisk | Where-Object Size -lt $MaxSizeInGigaBytes | Where-Object Size -gt $MinSizeInGigaBytes
Kann man ggf. noch geschickter formulieren.

Äh? Hat das irgendwer gelesen? Hallo?
Sind meine Beiträge zu kurz? Scrollt man da drüber?
Muss ich Katzen/Hunde/Brüste-Bilder einfügen für mehr Aufmerksamkeit?

Du könntest natürlich auch ganz stumpf nach dem Teilstring "RAM" im Laufwerksnamen suchen! :roll:


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:21 Uhr.

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