AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Dword -> word ?

Ein Thema von Schucki · begonnen am 18. Mär 2017 · letzter Beitrag vom 19. Mär 2017
Antwort Antwort
Seite 1 von 2  1 2      
Schucki

Registriert seit: 17. Jul 2004
158 Beiträge
 
Delphi 2010 Architect
 
#1

Dword -> word ?

  Alt 18. Mär 2017, 00:01
Delphi-Version: 2010
Hallo Profis,

ich habe ein Problem wo ich mir seit Tagen die Zähne aus beiße.
Ich habe einen Wert vom Typ DWORD und möchte den in 2 WORD Variable zerlegen.

Beispiel:

Delphi-Quellcode:
var
  dw: dword;
  w1: word;
  w2: word;

begin
  dw := $12345678;
  w1 := HigWord(dw);
  w2 := LowWord(dw);
  ShowMessage(IntToStr(dw));
  ShowMessage(IntToStr(w1));
  ShowMessage(IntToStr(w2));
end;
Inhalt von dw stimmt noch aber von d1 und d2 nicht. Da steht immer $FFFF drin, was mach ich da falsch? Ich erwarte eigentlich für d1 $1234 und d2 $5678 ?

Gruß Frank
Frank
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

AW: Dword -> word ?

  Alt 18. Mär 2017, 00:41
Woher stammen denn die Funktionen? Mein Delphi kennt nur HiWord und LoWord aus Winapi.Windows.

Alternativ manuell:
Delphi-Quellcode:
  w1 := (dw shr 16) and $FFFF;
  w2 := dw and $FFFF;
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl (18. Mär 2017 um 00:45 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.034 Beiträge
 
Delphi 12 Athens
 
#3

AW: Dword -> word ?

  Alt 18. Mär 2017, 02:12
Ich glaub fast nicht, dass es diese Typen überhaupt standardmäßig im Delphi gibt, vor allem da "Hig" falsch geschrieben ist.

HiWord, LoWord, High und Low gibt es, wobei High(Word) natürlich $FFFF ist und Low(Word) ist 0.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Schucki

Registriert seit: 17. Jul 2004
158 Beiträge
 
Delphi 2010 Architect
 
#4

AW: Dword -> word ?

  Alt 18. Mär 2017, 10:49
Danke für Eure Antworten, es war schon spät und ich hab das aus dem Kopf geschrieben ohne C&P aus Delphi deshalb die Fehler und auch die HEX Schreibweise weil ich die DEZ Werte nicht aus dem Kopf kannte.

Ich schick mal die GANZE Funktion, es geht darum die Lautstärke von einer Soundkarte zu ermitteln.

Delphi-Quellcode:
uses Classes, SysUtils, Windows, Dialogs, MmSystem;

function GetWaveVolume(uDeviceId:Cardinal; var wLVol: Word; var wRVol: Word): Boolean;
var
  WaveOutCaps: TWaveOutCaps;
  Volume: dword;
begin
  Result := False;
  if WaveOutGetDevCaps(uDeviceId, @WaveOutCaps, SizeOf(WaveOutCaps)) = MMSYSERR_NOERROR then
  if WaveOutCaps.dwSupport and WAVECAPS_VOLUME = WAVECAPS_VOLUME then begin
    Result := WaveOutGetVolume(uDeviceId, @Volume) = MMSYSERR_NOERROR;
    wLVol := HiWord(volume);
    wRVol := LoWord(volume);
  end;
end;
In wLVol und dRVol ist hier immer $FFFF (65535), setze ich einen Breakpoint in der Funktion dann sehe ich das in Volume aber tatsächlich $19999999 (4294967295) steht.

Es müste also einmal $1999 und einmal $9999 heraus kommen, tut es aber nicht.
Hoffe das es nun komplett ist und ihr eine Lösung habt.
Frank
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.142 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Dword -> word ?

  Alt 18. Mär 2017, 10:54
http://www.delphipraxis.net/622763-post7.html
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Dword -> word ?

  Alt 18. Mär 2017, 11:04
wie wäre es hiermit:
Delphi-Quellcode:
type
  tmr = packed record
    w1 : word;
    w0 : word;
  end;
var
  a : cardinal;
  b: integer;

begin
  a:=$12345678 ;
  memo1.Lines.Add(inttohex(tmr(a).w1,4));
  memo1.Lines.Add(inttohex(tmr(a).w0,4));
  b:=$12345678;
  memo1.Lines.Add(inttohex(tmr(b).w1,4));
  memo1.Lines.Add(inttohex(tmr(b).w0,4));
end;
Gruß
K-H

Edith:
das gleiche in Grün
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.142 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Dword -> word ?

  Alt 18. Mär 2017, 11:13
Delphi-Quellcode:
type
  tmr = packed record
    w1 : word;
    w0 : word;
  end;
var
  mr : Tmr;
  a : cardinal absolute mr;

begin
  a:=$12345678 ;
  memo1.Lines.Add(inttohex(mr.w1,4));
  memo1.Lines.Add(inttohex(mr.w0,4));
end;

Dann aber so...
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#8

AW: Dword -> word ?

  Alt 18. Mär 2017, 11:19
Das kennen doch nur die alten säcke

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.142 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: Dword -> word ?

  Alt 18. Mär 2017, 11:33
Das kennen doch nur die alten säcke
Und die müssen dafür sorgen, dass die Kiddys das nicht vergessen...
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.057 Beiträge
 
Delphi XE2 Professional
 
#10

AW: Dword -> word ?

  Alt 18. Mär 2017, 11:37
In wLVol und dRVol ist hier immer $FFFF (65535), setze ich einen Breakpoint in der Funktion dann sehe ich das in Volume aber tatsächlich $19999999 (4294967295) steht.

Es müste also einmal $1999 und einmal $9999 heraus kommen, tut es aber nicht.
Hoffe das es nun komplett ist und ihr eine Lösung habt.
Wenn Volume den Wert $19999999 hätte, dann wäre das dezimal 429496729 (nicht 4294967295)
Anders herum, wenn Volume den Wert dezimal 4294967295 hätte dann wäre das $FFFFFFFF.
Da (bei mir) im Debugger die dezimalen Werte angezeigt werden, vermute ich, dass Volume den Wert 4294967295 = $FFFFFFFF hat und du beim Umrechnen die am Ende stehende 5 vergessen hast.
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:03 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