<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[mehrere Registry Werte(deren Daten) lesen+ausgeben]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich muss in einem Programm einige Registry Werte auslesen und ausgeben.<br />
Alle Werte sind unter demselben Schlüssel, alle Werte sind REG_SZ.<br />
Wenn ich nur einen Wert auslese und ausgebe, funktioniert alles ohne Probleme.<br />
Wenn ich aber mehrere Werte auslese, stimmt die ausgabe nicht mit den werten überein.</p>
<p>Als kleines Beispielprogramm habe ich mal die Werte für das automatische Anmelden versucht zu lesen und auszugeben.<br />
Wert: Daten (überprüft per Registry-Editor)<br />
--------------<br />
DefaultUserName: julian<br />
DefaultDomain: JULIAN-DESKTOP1<br />
DefaultPassword: *leer*</p>
<p>Die Ausgabe meines Programms:</p>
<pre><code>DefaultUserName:	ju
DefaultDomain:	u
DefaultPassword:
</code></pre>
<p>Der Programmcode:</p>
<pre><code class="language-cpp">#include  &lt;iostream&gt;
#include  &lt;Windows.h.&gt;
using namespace std;

typedef unsigned char uchar;
typedef unsigned long ulong;

//  Variablen
HKEY hklm;
uchar name[1], domain[1], password[1];
ulong len = 256;

//  Funktionen
void GetValue( char value[256], uchar &amp; ptr )
{
  RegQueryValueEx( hklm,
       value,
       NULL,
       NULL,
       ( unsigned char * ) &amp; ptr,
       &amp; len
       );
}

int main()
{

  //  Schlüssel öffnen
  RegOpenKeyEx( HKEY_LOCAL_MACHINE,
       &quot;SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon&quot;,
       0,
       KEY_READ,
       &amp; hklm
       );

  //  DefaultUserName lesen
  GetValue( &quot;DefaultUserName&quot;, * name );

  //  DefaultDomain lesen
  GetValue( &quot;DefaultDomain&quot;, * domain );

  //  DefaultPassword lesen
  GetValue( &quot;DefaultPassword&quot;, * password );

  //  Schlüssel schließen
  RegCloseKey( hklm );

  //  Test-Ausgabe
  cout &lt;&lt; &quot;DefaultUserName:\t&quot; &lt;&lt; name &lt;&lt; endl
       &lt;&lt; &quot;DefaultDomain:\t&quot; &lt;&lt; domain &lt;&lt; endl
       &lt;&lt; &quot;DefaultPassword:\t&quot; &lt;&lt; password &lt;&lt; endl;

  system( &quot;pause&gt;nul&quot; );

  return 0;
}
</code></pre>
<p>Dazu sei gesagt, dass ich erst seit ca. 1/2 Jahr C++ lerne und daher noch bei Konsolenprogrammen bin, nur falls sich jemand fragt, weshalb der typ hier nur alles in der konsole ausgibt.</p>
<p>Schonmal DANKE an alle, die mir helfen und helfen werden. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/152022/mehrere-registry-werte-deren-daten-lesen-ausgeben</link><generator>RSS for Node</generator><lastBuildDate>Wed, 22 Jul 2026 15:12:46 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/152022.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 02 Jul 2006 00:21:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to mehrere Registry Werte(deren Daten) lesen+ausgeben on Sun, 02 Jul 2006 00:21:03 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich muss in einem Programm einige Registry Werte auslesen und ausgeben.<br />
Alle Werte sind unter demselben Schlüssel, alle Werte sind REG_SZ.<br />
Wenn ich nur einen Wert auslese und ausgebe, funktioniert alles ohne Probleme.<br />
Wenn ich aber mehrere Werte auslese, stimmt die ausgabe nicht mit den werten überein.</p>
<p>Als kleines Beispielprogramm habe ich mal die Werte für das automatische Anmelden versucht zu lesen und auszugeben.<br />
Wert: Daten (überprüft per Registry-Editor)<br />
--------------<br />
DefaultUserName: julian<br />
DefaultDomain: JULIAN-DESKTOP1<br />
DefaultPassword: *leer*</p>
<p>Die Ausgabe meines Programms:</p>
<pre><code>DefaultUserName:	ju
DefaultDomain:	u
DefaultPassword:
</code></pre>
<p>Der Programmcode:</p>
<pre><code class="language-cpp">#include  &lt;iostream&gt;
#include  &lt;Windows.h.&gt;
using namespace std;

typedef unsigned char uchar;
typedef unsigned long ulong;

//  Variablen
HKEY hklm;
uchar name[1], domain[1], password[1];
ulong len = 256;

//  Funktionen
void GetValue( char value[256], uchar &amp; ptr )
{
  RegQueryValueEx( hklm,
       value,
       NULL,
       NULL,
       ( unsigned char * ) &amp; ptr,
       &amp; len
       );
}

int main()
{

  //  Schlüssel öffnen
  RegOpenKeyEx( HKEY_LOCAL_MACHINE,
       &quot;SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon&quot;,
       0,
       KEY_READ,
       &amp; hklm
       );

  //  DefaultUserName lesen
  GetValue( &quot;DefaultUserName&quot;, * name );

  //  DefaultDomain lesen
  GetValue( &quot;DefaultDomain&quot;, * domain );

  //  DefaultPassword lesen
  GetValue( &quot;DefaultPassword&quot;, * password );

  //  Schlüssel schließen
  RegCloseKey( hklm );

  //  Test-Ausgabe
  cout &lt;&lt; &quot;DefaultUserName:\t&quot; &lt;&lt; name &lt;&lt; endl
       &lt;&lt; &quot;DefaultDomain:\t&quot; &lt;&lt; domain &lt;&lt; endl
       &lt;&lt; &quot;DefaultPassword:\t&quot; &lt;&lt; password &lt;&lt; endl;

  system( &quot;pause&gt;nul&quot; );

  return 0;
}
</code></pre>
<p>Dazu sei gesagt, dass ich erst seit ca. 1/2 Jahr C++ lerne und daher noch bei Konsolenprogrammen bin, nur falls sich jemand fragt, weshalb der typ hier nur alles in der konsole ausgibt.</p>
<p>Schonmal DANKE an alle, die mir helfen und helfen werden. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1089889</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1089889</guid><dc:creator><![CDATA[Julian__]]></dc:creator><pubDate>Sun, 02 Jul 2006 00:21:03 GMT</pubDate></item><item><title><![CDATA[Reply to mehrere Registry Werte(deren Daten) lesen+ausgeben on Sun, 02 Jul 2006 02:50:14 GMT]]></title><description><![CDATA[<p>Dein Code ist grober Unfug. Das er Funktioniert, wenn du nur einen Wert aus der Registry ließt ist reines Glück und kann auch eine Speicherverletzung geben.</p>
<p>Julian__ schrieb:</p>
<blockquote>
<pre><code class="language-cpp">uchar name[1], domain[1], password[1];
</code></pre>
</blockquote>
<p>Du reservierst hier jeweils Speicherplatz für 1 (in Worten: einen) Character. Das wird wohl zu wenig sein. BTW: Wieso global!?</p>
<p>Julian__ schrieb:</p>
<blockquote>
<pre><code class="language-cpp">void GetValue( char value[256], uchar &amp; ptr )
//
//...
//
//Aufruf:
//
GetValue( &quot;DefaultUserName&quot;, * name );
</code></pre>
</blockquote>
<p>Wieso nimmst du als ersten Parameter für GetValue ein Array? <em>uchar &amp;ptr</em> ist eine Referenz und kein Zeiger - wie deir Name ptr vermuten lassen könnte. Beim Aufruf dereferenzierst du <em>name</em> (*<em>name</em>) und übergibst dadurch den Wert in <em>name[0]</em>. GetValue nimmt davon eine Referenz <em>ptr</em>.</p>
<p>Julian__ schrieb:</p>
<blockquote>
<pre><code class="language-cpp">void GetValue( char value[256], uchar &amp; ptr )
{
  RegQueryValueEx( hklm,
       value,
       NULL,
       NULL,
       ( unsigned char * ) &amp; ptr,  // &lt;- 1)
       &amp; len                       // &lt;- 2)
       );
}
</code></pre>
</blockquote>
<p>ad 1)<br />
Hier nimmst du die Adresse von <em>ptr</em> was bedeutet die adresse von <em>name[0]</em> und RegQueryValueEx überschreibt es mitsamt des darauffolgenden Speichers -&gt; Speicherverletzung!</p>
<p>ad 2)<br />
RegQueryValueEx gibt dir in len (Anfangs 256) die Länge des in ptr zurückgegeben Strings zurück wodurch len für die weiteren Aufrufe verändert wird.</p>
<p>Weiters könnte es natürlich auch sein, das RegQueryValueEx fehlschlägt.</p>
<p>Ließ die Kapitel über Pointer und Speicherverwaltung in einem C/C++ Buch deines vertrauens nocheinmal gründlich durch!</p>
<p>So gehts:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;

#include &lt;windows.h&gt;

using namespace std;

void wait( )
{
    cout &lt;&lt; endl &lt;&lt; &quot;Press return to continue...&quot; &lt;&lt; endl;
    cin.clear();
    cin.ignore(std::cin.rdbuf()-&gt;in_avail());
    cin.get();
}

string get_errmsg( unsigned long error )
{
    void *buffer;
    FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
                   0,
                   error,
                   MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ),
                   reinterpret_cast&lt; char* &gt;( &amp;buffer ),
                   0,
                   0
    );

    string errmsg = string( reinterpret_cast&lt; char* &gt;( buffer ) );
    LocalFree( buffer );
    return errmsg;
}

bool reg_read_value_string( string &amp;value, const HKEY &amp;hkey, const char *value_name )
{
    unsigned long value_type;

    // test for data type:
    RegQueryValueEx( hkey, value_name, 0, &amp;value_type, 0, 0 );

    if( value_type != REG_SZ )

        return false;

    // read the data:

    unsigned long result;
    unsigned long size = 1;
    unsigned char *data = new unsigned char[ 1 ];

    if( ( result = RegQueryValueEx( hkey, value_name, 0, 0, data, &amp;size ) ) ) {

        delete [ ] data;

        if( result != ERROR_MORE_DATA )

            return false;

        try {

            data = new unsigned char[ size ];

        } catch( bad_alloc ) {

            return false;
        }

        if( RegQueryValueEx( hkey, value_name, 0, 0, data, &amp;size ) )

            return false;
    }

    value = reinterpret_cast&lt; char* &gt;( data );
    delete [ ] data;
    return true;
}

int main()
{
    HKEY reg_key;
    unsigned long result;

    if( ( result = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
                                 &quot;SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon&quot;,
                                 0,
                                 KEY_READ,
                                 &amp;reg_key
                               )
        ) ) {

        cout &lt;&lt; &quot;RegOpenKeyEx() failed:&quot; &lt;&lt; endl;
        cout &lt;&lt; get_errmsg( result ) &lt;&lt; endl;
        wait( );
        return EXIT_FAILURE;
    }

    string name, domain, password;

    if( !reg_read_value_string( name, reg_key, &quot;DefaultUserName&quot; ) ) {

        RegCloseKey( reg_key );
        cout &lt;&lt; &quot;Failed to read DefaultUserName!&quot; &lt;&lt; endl;
        wait( );
        return EXIT_FAILURE;

    } else {

        cout &lt;&lt; &quot;DefaultUserName: &quot; &lt;&lt; name &lt;&lt; endl;
    }

    if( !reg_read_value_string( domain, reg_key, &quot;DefaultDomainName&quot; ) ) {

        RegCloseKey( reg_key );
        cout &lt;&lt; &quot;Failed to read DefaultUserName!&quot; &lt;&lt; endl;
        wait( );
        return EXIT_FAILURE;

    } else {

        cout &lt;&lt; &quot;DefaultDomain:   &quot; &lt;&lt; domain &lt;&lt; endl;
    }

    if( !reg_read_value_string( password, reg_key, &quot;DefaultPassword&quot; ) ) {

        RegCloseKey( reg_key );
        cout &lt;&lt; &quot;Failed to read DefaultUserName!&quot; &lt;&lt; endl;
        wait( );
        return EXIT_FAILURE;

    } else {

        cout &lt;&lt; &quot;DefaultPassword: &quot; &lt;&lt; password &lt;&lt; endl;
    }

    RegCloseKey( reg_key );

    wait( );
    return EXIT_SUCCESS;
}
</code></pre>
<p>Greetz, Swordfish</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1089899</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1089899</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Sun, 02 Jul 2006 02:50:14 GMT</pubDate></item><item><title><![CDATA[Reply to mehrere Registry Werte(deren Daten) lesen+ausgeben on Sun, 02 Jul 2006 12:48:09 GMT]]></title><description><![CDATA[<p>hi Swordfish, danke für deine hilfe.</p>
<p>ja, das kommt davon, wenn man spät abends noch mit sowas (für mich recht anspruchsvollem) anfängt. heute morgen hab ich erst ma selbst über den code gelacht.<br />
ich hatte keine lust mehr auf die ganzen fehlermeldungen und habe so lange (recht kurz) mit * und &amp; ausprobiert, bis keine mehr kamen.</p>
<p>naja, ich finds toll, dass du mir hier eine fertige lösung vorgibst, aber ich mach das ja grad, um nicht auf copy&amp;paste zurückgreifen zu müssen, ich würd den code auch gern verstehen.<br />
beim größten teil komm ich auch mit, aber könntest du mir vielleicht nochmal<br />
get_errmsg() und reinterpret_cast&lt;&gt;() erklären?<br />
ich habe schon danach gegoogelt, aber nichts wirklich gut verständliches gefunden.<br />
wär echt nett von dir.<br />
außerdemverstehe ich das hier</p>
<pre><code class="language-cpp">if( ( result = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
                                 &quot;SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon&quot;,
                                 0,
                                 KEY_READ,
                                 &amp;reg_key
                               )
        ) ) {

        cout &lt;&lt; &quot;RegOpenKeyEx() failed:&quot; &lt;&lt; endl;
        cout &lt;&lt; get_errmsg( result ) &lt;&lt; endl;
        wait( );
        return EXIT_FAILURE;
    }
</code></pre>
<p>nicht ganz (wann ist if(true), wann if(false)?), wäre nett, auch das nochmal zu erläutern. danke.</p>
<p>mfg, julian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1090098</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1090098</guid><dc:creator><![CDATA[Julian__]]></dc:creator><pubDate>Sun, 02 Jul 2006 12:48:09 GMT</pubDate></item><item><title><![CDATA[Reply to mehrere Registry Werte(deren Daten) lesen+ausgeben on Sun, 02 Jul 2006 14:13:27 GMT]]></title><description><![CDATA[<p>Lass dich von diesem groben Unfug nicht verwirren. reinterpret_cast&lt; char* &gt; ist im Prinzip das gleiche wie (char*) also ein reiner Cast. Ich verstehe auch nicht warum Swordfish seinen Code immer unnötig kompliziert machen muss, damit Neulinge wie du ihn dann eh nicht verstehen.</p>
<p>Zu deiner anderen Frage: Schau doch mal hier <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/regopenkeyex.asp" rel="nofollow">http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/regopenkeyex.asp</a></p>
<p>Wenn alles klappt liefert RegOpenKeyEx ERROR_SUCCESS zurück. ERROR_SUCCESS ist als 0 definiert, deshalb klappt das. Ob ERROR_SUCCESS allerdings für immer garantiert ist 0 zurückzugeben, ist eine andere Frage. Wenn nicht, dann ist Swordfishs code auch in dieser Hinsicht grob fahrlässig.</p>
<p>MfG,<br />
:schland: *Ranner* :schland:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1090150</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1090150</guid><dc:creator><![CDATA[*Ranner*]]></dc:creator><pubDate>Sun, 02 Jul 2006 14:13:27 GMT</pubDate></item><item><title><![CDATA[Reply to mehrere Registry Werte(deren Daten) lesen+ausgeben on Sun, 02 Jul 2006 14:26:12 GMT]]></title><description><![CDATA[<p>{ Ranner | <em>Ranner</em> | Real_Ranner } schrieb:</p>
<blockquote>
<p>Lass dich von diesem groben Unfug nicht verwirren.</p>
</blockquote>
<p>Kannst du mir bitte mal erklären, was an meinem Code &quot;grober Unfug&quot; ist!?</p>
<p>{ Ranner | <em>Ranner</em> | Real_Ranner } schrieb:</p>
<blockquote>
<p>reinterpret_cast&lt; char* &gt; ist im Prinzip das gleiche wie (char*) also ein reiner Cast.</p>
</blockquote>
<p>Nein ist es nicht. Was soll ein &quot;reiner Cast&quot; sein!?</p>
<p>{ Ranner | <em>Ranner</em> | Real_Ranner } schrieb:</p>
<blockquote>
<p>Ich verstehe auch nicht warum Swordfish seinen Code immer unnötig kompliziert machen muss, damit Neulinge wie du ihn dann eh nicht verstehen.</p>
</blockquote>
<p>Ich schreibe meinen Code sicherlich nicht &quot;unnötig kompiziert&quot;, sondern tu was notwendig ist.</p>
<p>{ Ranner | <em>Ranner</em> | Real_Ranner } schrieb:</p>
<blockquote>
<p>Wenn nicht, dann ist Swordfishs code auch in dieser Hinsicht grob fahrlässig.</p>
</blockquote>
<p>Ich trau' mich die Hand dafür in's Feuer legen, das ERROR_SUCCESS bis in alle Ewigkeit (oder, falls das früher eintritt: bis es diese Konstante nicht mehr gibt) 0 (in Worten: Null) sein und bleiben wird.</p>
<p>Greetz, Swordfish</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1090157</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1090157</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Sun, 02 Jul 2006 14:26:12 GMT</pubDate></item><item><title><![CDATA[Reply to mehrere Registry Werte(deren Daten) lesen+ausgeben on Sun, 02 Jul 2006 14:27:38 GMT]]></title><description><![CDATA[<p>du nutzt zum beispiel nicht std::vector. das macht den code bisschen komplizierter</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1090159</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1090159</guid><dc:creator><![CDATA[*vector*]]></dc:creator><pubDate>Sun, 02 Jul 2006 14:27:38 GMT</pubDate></item><item><title><![CDATA[Reply to mehrere Registry Werte(deren Daten) lesen+ausgeben on Sun, 02 Jul 2006 15:27:05 GMT]]></title><description><![CDATA[<p>ok, danke an swordfish für den code.<br />
ich glaub, jetzt hab ich ihn auch verstanden, zumindest funktioniert er.</p>
<p>anstatt <em><em>reinterpret_cast&lt;char</em>&gt;</em>* kann ich auch die normale explizite typumwandlung <em><em>(char</em>)</em>* benutzen, das hab ich ausprobiert.</p>
<p>wo der unterschied zu reinterpret_cast&lt;char*&gt; liegt, weiß ich allerdings immer noch nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1090193</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1090193</guid><dc:creator><![CDATA[Julian__]]></dc:creator><pubDate>Sun, 02 Jul 2006 15:27:05 GMT</pubDate></item><item><title><![CDATA[Reply to mehrere Registry Werte(deren Daten) lesen+ausgeben on Sun, 02 Jul 2006 17:00:14 GMT]]></title><description><![CDATA[<p>@*vector*: Ok, 1:0 für dich <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>ein <em>reinterpret_cast</em>&lt; <em>type</em> &gt;( <em>var</em> ) sorgt dafür, das der Speicher, auf welchen <em>var</em> Zeigt wie <em>type</em> interpretiert wird. Hätte wir zum Beispiel</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

int main( )
{
//  einen

    float f = 2.345f;

//  dann könnten wir mit einem

    unsigned char *p = reinterpret_cast&lt; unsigned char* &gt;( &amp;f );

//  an das erste Byte von f kommen und so

    for( size_t i = 0; i &lt; sizeof( float ); ++i ) {

        cout &lt;&lt; &quot;0x&quot;;
        cout.width( 2 );
        cout.fill( '0' );
        cout &lt;&lt; hex &lt;&lt; p[ i ] &lt;&lt; &quot; &quot;;
    }

//  alle Bytes nacheinander ausgeben.
</code></pre>
<p>Der Unterschied zu einem <em>C-Style Cast</em> ist, daß man mit ihm keine <em>const</em>s &quot;wegcasten&quot; kann:</p>
<pre><code class="language-cpp">int main( )
{
    const char str[ ] = &quot;Hello&quot;;
    char *p = reinterpret_cast&lt; char* &gt;( str ); // &lt;- *)
}
</code></pre>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title="*)"
      alt="😉"
    /> wird zu einem Compilerfehler ähnlich dem Wortlaut &quot;'reinterpret_cast' : 'const char [6]' kann nicht in 'char *' konvertiert werden&quot; führen. Mit einem <em>C-Style Cast</em> ist dies möglich:</p>
<pre><code class="language-cpp">int main( )
{
    const char str[ ] = &quot;Hello&quot;;
    char *p = ( char* ) str;

    cout &lt;&lt; &quot;Before: \&quot;&quot; &lt;&lt; str &lt;&lt; &quot;\&quot;&quot; &lt;&lt; endl;

    p[ 1 ] = 'a'; // wir schreiben munter in konstanten Speicher!

    cout &lt;&lt; &quot;After: \&quot;&quot; &lt;&lt; str &lt;&lt; &quot;\&quot;&quot; &lt;&lt; endl;
}
</code></pre>
<p>Ausgabe:</p>
<pre><code>Before: &quot;Hello&quot;
After: &quot;Hallo&quot;
</code></pre>
<p>Mit <em>C++ Casts</em> wäre dazu explizit ein <em>const_cast</em> nötig:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

int main( )
{
    const char str[ ] = &quot;Hello&quot;;
    char *p = const_cast&lt; char* &gt;( str );

    cout &lt;&lt; &quot;Before: \&quot;&quot; &lt;&lt; str &lt;&lt; &quot;\&quot;&quot; &lt;&lt; endl;

    p[ 1 ] = 'a';

    cout &lt;&lt; &quot;After: \&quot;&quot; &lt;&lt; str &lt;&lt; &quot;\&quot;&quot; &lt;&lt; endl;
}
</code></pre>
<p>Somit kann es mit <em>C++ Casts</em> nicht passieren, das man sich &quot;aus versehen&quot; in's Bein schießt.</p>
<p>Greetz, Swordfish</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1090252</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1090252</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Sun, 02 Jul 2006 17:00:14 GMT</pubDate></item><item><title><![CDATA[Reply to mehrere Registry Werte(deren Daten) lesen+ausgeben on Mon, 03 Jul 2006 15:40:39 GMT]]></title><description><![CDATA[<p>ok, danke swordfish.<br />
nachdem ich mir deinen code durchgelesen und (glaube ich) auch verstanden habe, habe ich es nochmal selbst probiert, um zu sehen, ob ich es jetzt selbst hinbekommen würde (dabei habe ich zwar für mich nicht notwendige teile deines codes weggelassen, jedoch habe ich mich, wie du sehen wirst, sehr an deinem orientiert.). anscheinend ist das nicht der fall, denn bei folgendem code kommt mal wieder nicht die richtige ausgabe.<br />
bitte korrigieren, wenn ich irgendwas falsch sehe (siehe kommentare)!</p>
<p>code:</p>
<pre><code class="language-cpp">#include  &lt;iostream&gt;
#include  &lt;string&gt;
#include  &lt;windows.h&gt;

using namespace std;

#define cls system(&quot;cls&quot;)
#define wait  system  (&quot;pause&gt;nul&quot;)
void  color(string  pColor)
{
  string  cmdstr  = &quot;color &quot;  + pColor;
  system(cmdstr.c_str());
}

typedef unsigned  long  ulong;
typedef unsigned  char  uchar;

bool  RegReadValueString(  string &amp;value_data, const HKEY  &amp;hkey,  const char* value)
{
  ulong val_type;

  //  Typ des Wertes prüfen
  RegQueryValueEx(  hkey, //  Schlüssel -ein
                    value,  //  Wert  -ein
                    0,  //  immer NULL  -ein
                    &amp;val_type, //  Typ des Wertes -aus
                    0,  //  Puffer für Daten des Wertes -ein
                    0 //  Größe des Puffers -aus
                 );

  if( val_type  !=  REG_SZ  )
    return  false;  //  falls Werte-Typ !=  String

  //  Daten lesen
  ulong result;
  ulong size  = 1;  //  Größe des Daten-Puffers
  uchar *data = new uchar[1]; //  Daten-Puffer  ( Platz für 1 Zeichen =&gt; \0 )

  if( result  = RegQueryValueEx(  hkey, value,  0,  0,  data, &amp;size  ) )
  {
    delete  []  data;

    if( result  !=  ERROR_MORE_DATA )
      return  false;  //  Falls Daten = &quot;\0&quot;

    try
    {
      data  = new uchar[size];  //  Puffer  auf die richtige Größe bringen
    }
    catch(  bad_alloc )
    {
      return  false;  //  falls Vergrößern des Puffers fehlschlägt
    }

    if( RegQueryValueEx(  hkey, value,  0,  0,  data, &amp;size ) )
      return  false;  //  falls weitere Fehler auftreten
  }
  value_data  = (char*) data;  //  Daten in C-String-Parameter schreiben
  delete  []  data; //  Daten-Array leeren
  return  true; //  bei Erfolg

} //  RegDataToStr

int main()
{
  HKEY  hkey;
  string  status, name, domain, password;

  //  Schlüssel öffnen
  if( RegOpenKeyEx( HKEY_LOCAL_MACHINE, //  Host-Key
                    &quot;SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon&quot;,
                      //  Unerschlüssel
                    0,  //  immer NULL
                    KEY_READ, //  Zugriffsberechtigungen zum öffnen
                    &amp;hkey //  HKEY-Handle
                  )
    )
  {
    cls;
    color(&quot;c&quot;);
    cout  &lt;&lt;  &quot;Fehler: HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\&quot;
          &lt;&lt;  &quot;CurrentVersion\\Winlogon konnte nicht geoeffnet werden.\n&quot;
          &lt;&lt;  &quot;beliebige Taste zum Beenden ...\n&quot;;
    wait;
    exit(-1);
  }

  //  Daten lesen

  //  Status lesen
  if( !RegReadValueString(  status, hkey, &quot;AutoAdminLogon&quot; ) )
  {
    cls;
    color(&quot;c&quot;);
    cout  &lt;&lt;  &quot;Fehler: AutoAdminLogon konnte nicht gelesen werden.\n&quot;;
    cout  &lt;&lt;  &quot;name&quot;;
    wait;
    exit(-1);
  }
  else
  {
    if( status  ==  &quot;1&quot; )
      status  = &quot;AKTIVIERT&quot;;
    else
      status  = &quot;DEAKTIVIERT&quot;;
  }

  //  Namen lesen
  if( !RegReadValueString( name, hkey, &quot;DefaultUserName&quot; )  )
  {
    cls;
    color(&quot;c&quot;);
    cout  &lt;&lt;  &quot;Fehler: DefaultUserName konnte nicht gelesen werden.\n&quot;;
    wait;
    exit(-1);
  }

  //  Domain lesen
  if( !RegReadValueString(  domain, hkey, &quot;DefaultDomain&quot; ) )
  {
    cls;
    color(&quot;c&quot;);
    cout  &lt;&lt;  &quot;Fehler: DefaultDomain konnte nicht gelesen werden.\n&quot;;
    wait;
    exit(-1);
  }

  //  Passwort lesen
  if( !RegReadValueString(  password, hkey, &quot;DefaultPassword&quot; ) )
  {
    cls;
    color(&quot;c&quot;);
    cout  &lt;&lt;  &quot;Fehler: DefaultPassword konnte nicht gelesen werden.\n&quot;;
    wait;
    exit(-1);
  }

  //  Hauptmenü ausgeben
  hm:

  int choice;

  cls;
  cout  &lt;&lt;  &quot;\t\tautomatischer Login  ist &quot;  &lt;&lt;  status  &lt;&lt;  endl
        &lt;&lt;  &quot;\t\tBenutzername:            &quot; &lt;&lt;  name  &lt;&lt;  endl
        &lt;&lt;  &quot;\t\tDomain:                  &quot; &lt;&lt;  domain  &lt;&lt;  endl
        &lt;&lt;  &quot;\t\tPasswort:                &quot; &lt;&lt;  password  &lt;&lt;  endl;
  return  0;
}
</code></pre>
<p>ausgabe:</p>
<pre><code>Fehler: DefaultDomain konnte nicht gelesen werden.
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1090788</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1090788</guid><dc:creator><![CDATA[Julian__]]></dc:creator><pubDate>Mon, 03 Jul 2006 15:40:39 GMT</pubDate></item><item><title><![CDATA[Reply to mehrere Registry Werte(deren Daten) lesen+ausgeben on Mon, 03 Jul 2006 19:37:56 GMT]]></title><description><![CDATA[<p>Ok, hab's mir angesehen. Der Code tut genau das, was er tun soll. Haste gut gemacht *tätschel* <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Julian__ schrieb:</p>
<blockquote>
<p>ausgabe:</p>
<pre><code>Fehler: DefaultDomain konnte nicht gelesen werden.
</code></pre>
</blockquote>
<p>Ich nehme mal an, das SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\AutoAdminLogon bei dir (wie auch bei mir) schlichtweg nicht existiert. Du könntest jeden Wert auf Existenz prüfen, bevor du versuchst ihn zu lesen und wenn ein Wert nicht existiert mit dem nächsten weitermachen. Testen kannst du das zB. mit:</p>
<pre><code class="language-cpp">bool reg_value_exists( HKEY reg_key, const string value )
{
    char value_name[ 256 ];
    unsigned long size = 256;

    long result = 0;

    if( ( result = RegEnumValue( reg_key, 0, value_name, &amp;size, 0, 0, 0, 0 ) ) )
        return false;

    if( value.compare( value_name ) == 0 )
        return true;

    for( unsigned long i = 1; true; ++i ) {

        size = 256;

        if( ( result = RegEnumValue( reg_key, i, value_name, &amp;size, 0, 0, 0, 0 ) ) )
            return false;

        if( value.compare( value_name ) == 0 )
            return true;

        ++i;

    } while( true );

    return false;
}
</code></pre>
<p>Achja, noch was zu deinem Code:</p>
<pre><code class="language-cpp">// ...

#define cls system(&quot;cls&quot;)             // 1)
#define wait  system  (&quot;pause&gt;nul&quot;)   // 2)

void color(string  pColor)            // 3)
{
  string  cmdstr  = &quot;color &quot;  + pColor;
  system(cmdstr.c_str());
}

// ...

exit(-1);                             // 4)

// ...

hm:                                   // nicht benutzt
int choice;                           // ebenfalls
</code></pre>
<ol>
<li>wenn du einen Makro als einen Funktionsersatz verwendest, solltest du im á la</li>
</ol>
<pre><code class="language-cpp">#define cls() system(&quot;cls&quot;)

// Aufruf:

cls();
</code></pre>
<p>Klammern verpassen, damit man nicht in Versuchung kommt, ihn für einen Variablenamen zu halten.</p>
<ol start="2">
<li>
<p>schau dir mal <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /> <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-111042.html" rel="nofollow">DOS und Win32-Konsole :: Automatisches Schließen verhindern</a> an.</p>
</li>
<li>
<p>zum Löschen des Bildschirms und farbiger Ausgabe solltest du die <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /> <a href="http://ic.sidewindershome.net/" rel="nofollow">Improved Console</a> ansehen.</p>
</li>
<li>
<p>bei <em>exit</em>( <em>int code</em> ) verwendet man als Parameter üblicherweise <em>EXIT_SUCCESS</em> bzw. <em>EXIT_FAILURE</em>. Ein einfaches <em>return</em>( <em>0</em> ) tuts in den meisten fällen genauso gut.</p>
</li>
</ol>
<p>Hoff' ich konnt' helfen.</p>
<p>Greetz, Swordfish</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1090859</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1090859</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Mon, 03 Jul 2006 19:37:56 GMT</pubDate></item><item><title><![CDATA[Reply to mehrere Registry Werte(deren Daten) lesen+ausgeben on Mon, 03 Jul 2006 20:33:40 GMT]]></title><description><![CDATA[<p>ooh danke!</p>
<p>naja, mit deiner vermutung lagst du fast richtig.<br />
ich überleg den ganzen verdammten tag, woran das liegen könnte und eben fällt mir auf, dass der key ja nicht &quot;DefaultDomain&quot;, sondern &quot;DefaultDomainName&quot; heißt.<br />
schön blöd... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<p>ja, lacht ruhig, hab ich auch gemacht. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>und danke für die links!</p>
<p>aber: ich habe den C++BuilderX (borland), der war bei einem anfängerbuch dabei und gefällt mir sehr gur, ist halt nur keine RAD, aber ich schreib ja (noch) nur konsolenprogramme. und der C++BuilderX ist nicht unter den unterstützten compilern bei Improved Console aufgeführt. sollte das trotzdem klappen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1090900</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1090900</guid><dc:creator><![CDATA[Julian__]]></dc:creator><pubDate>Mon, 03 Jul 2006 20:33:40 GMT</pubDate></item><item><title><![CDATA[Reply to mehrere Registry Werte(deren Daten) lesen+ausgeben on Mon, 03 Jul 2006 21:07:21 GMT]]></title><description><![CDATA[<p>Julian__ schrieb:</p>
<blockquote>
<p>[...] der C++BuilderX ist nicht unter den unterstützten compilern bei Improved Console aufgeführt. sollte das trotzdem klappen?</p>
</blockquote>
<p>Entweder probierst du's einfach aus oder du fragst hier: <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /> <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-131915.html" rel="nofollow">Improved Console</a></p>
<p>Greetz, Swordfish</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1090911</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1090911</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Mon, 03 Jul 2006 21:07:21 GMT</pubDate></item><item><title><![CDATA[Reply to mehrere Registry Werte(deren Daten) lesen+ausgeben on Mon, 03 Jul 2006 21:24:46 GMT]]></title><description><![CDATA[<p>yo hab ich schon gemacht. funktioniert auch alles, bis auf die dropdown-menüs mit den möglichen methoden, aber das lässt sich verkraften.</p>
<p>ok, nochmal danke swordfish für deine hilfe hier bei meinen (meist durch eigene dummheit entstandenen) problemen.</p>
<p>euer forum werd ich mir merken, ist, wirklich gut hier, hab schon viel schlechteres erlebt.</p>
<p>mfg, julian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1090916</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1090916</guid><dc:creator><![CDATA[Julian__]]></dc:creator><pubDate>Mon, 03 Jul 2006 21:24:46 GMT</pubDate></item><item><title><![CDATA[Reply to mehrere Registry Werte(deren Daten) lesen+ausgeben on Mon, 03 Jul 2006 21:26:47 GMT]]></title><description><![CDATA[<p>eigentlich wollt ich nur kurz den post editieren, aba dann hab ich gemerkt: das geht nicht!</p>
<p>yo hab ich schon gemacht. funktioniert auch alles, bis auf die dropdown-menüs mit den möglichen methoden, aber das liegt ja am compiler (an der IDE).</p>
<p>ok, nochmal danke swordfish für deine hilfe hier bei meinen (meist durch eigene dummheit entstandenen) problemen.</p>
<p>euer forum werd ich mir merken, ist, wirklich gut hier, hab schon viel schlechteres erlebt.</p>
<p>mfg, julian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1090918</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1090918</guid><dc:creator><![CDATA[Julian__]]></dc:creator><pubDate>Mon, 03 Jul 2006 21:26:47 GMT</pubDate></item><item><title><![CDATA[Reply to mehrere Registry Werte(deren Daten) lesen+ausgeben on Mon, 03 Jul 2006 21:53:43 GMT]]></title><description><![CDATA[<p>Aber bitte, gerne!</p>
<p>Dieses Forum nicht nur merken, sonder <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /> <a href="http://www.c-plusplus.net/forum/profile-var-mode-is-register.html" rel="nofollow">Klicken</a> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Greetz, Swordfish</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1090930</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1090930</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Mon, 03 Jul 2006 21:53:43 GMT</pubDate></item><item><title><![CDATA[Reply to mehrere Registry Werte(deren Daten) lesen+ausgeben on Tue, 04 Jul 2006 15:29:05 GMT]]></title><description><![CDATA[<p>&lt;= und? wie steht mir das? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
ich find's irgendwie stylish.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1091306</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1091306</guid><dc:creator><![CDATA[Julian__]]></dc:creator><pubDate>Tue, 04 Jul 2006 15:29:05 GMT</pubDate></item></channel></rss>