Announcement

Collapse
No announcement yet.

C++ Builder - UUID vom Rechner erhalten

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • C++ Builder - UUID vom Rechner erhalten

    Ich habe folgendes Problem: Zur Überprüfung von Daten wird die UUID des Rechners als Absicherung benutzt.
    Wir ermitteln diese bereits in C# Programmen über den folgenden Aufruf:
    Code:
    GetManagementObjectInfo<Guid>("Win32_ComputerSystemProduct", "UUID");
    Gibt es etwas Entsprechendes auch in C++ / C++ Builder? Ich muss exakt die gleiche UUID erhalten wie in C#.

  • #2
    Seltsamerweise scheint MS eine Methode GetManagementObjectInfo nicht zu kennen
    Christian

    Comment


    • #3
      Oh sorry, da hatte sich noch mehr Code hinter versteckt:
      Code:
              private static TValue GetManagementObjectInfo<TValue>(string wmiClass, string wmiProperty)
              {
                  try
                  {
                      DataValidation.Required(wmiClass);
                      DataValidation.Required(wmiProperty);
      
                      using (var managementClass = new ManagementClass(wmiClass))
                      {
                          var managementObjects = managementClass.GetInstances();
                          object result = null;
                          foreach (ManagementObject managementObject in managementObjects)
                          {
                              result = managementObject.GetPropertyValue(wmiProperty);
                              break; // read only first object
                          }
                          return (TValue)DataConvert.TryChange(result ?? string.Empty, typeof(TValue));
                      }
                  }
                  catch (Exception x)
                  {
                      throw new ArgumentException("An error occurred while querying WMI: {0}", x.Message);
                  }
              }
      Hab mittlerweile schon nen ganzen Tag nach einer Möglichkeit gesucht die UUID in C++ Builder zu generieren, aber es scheint nicht möglich zu sein. Der einzige Weg sie zu generieren scheint über eine Visual Studio Library zu sein, die man im C++ Builder nicht verwenden kann.

      Siehe auch hier: http://www.dreamincode.net/forums/to...ine-uuid-in-c/

      Ich kann allerdings nicht einfach eine UUID aus der Registry nehmen, das würde bedeutet, wir müssten all unsere andere Software nochmal umschreiben nicht die VS UUID zu benutzen. Argh...

      Comment


      • #4
        Versuch mal
        https://social.msdn.microsoft.com/Fo...orum=vcgeneral
        Christian

        Comment


        • #5
          Ja, das ist leider genau der Code der nur in Visual Studio kompiliert und nicht im C++ Builder.

          Wegen:
          #include <comdef.h>
          #include <Wbemidl.h>
          # pragma comment(lib, "wbemuuid.lib")

          Um genau zu sein bekommt man die Fehlermeldung dass die wbemuuid.lib nicht gefunden wurde.

          Comment


          • #6
            http://www.ftpsearch.co/browse-en/17...b/WbemUuid.Lib
            Die Vertauenswürdigkeit der Seite kann ich allerdings nicht feststellen
            Christian

            Comment


            • #7
              Auf den Seiten die ich so gefunden hatte stand dass sie stark davon abraten zu versuchen einen VS library in einen anderen Compiler einzubinden. Schätze ich könnte es versuchen...

              Comment


              • #8
                Wenn du die DLL weisst, kannst du mit implib eine lib selber erzeugen
                Christian

                Comment


                • #9
                  Also man kann aus einer DLL eine Lib erzeugen für den C++ Builder?

                  Comment


                  • #10
                    ja mit implib geht das
                    Christian

                    Comment


                    • #11
                      Ok das mit der wbemuuid.lib hab ich aufgegeben, aber ich hab mir jetzt einfach eine Test-DLL in Visual Studio geschnappt, die einfach einen MD5 Hash zurückgibt, zum Testen, ob das überhaupt geht.

                      Wenn ich jetzt aber implib ausführe, also:
                      > implib -a Hash.lib Hash.dll
                      Gibt er nur "Warning Hash.dll: no exports" zurück und es ist weit und breit keine Hash.lib zu finden. =/

                      Liegt es daran, dass die DLL auf C# basiert?


                      Eventuell versuche ich es mal indem ich eine C++ DLL schreibe und dann so:
                      http://bcbjournal.org/articles/vol4/...h_CBuilder.htm

                      Und um das Linker Problem zu lösen dann eventuell dynamisch die Pointer holen:
                      http://stackoverflow.com/questions/8...ion-from-a-dll (http://pastie.org/3109815)
                      http://msdn.microsoft.com/en-us/libr...dynamic_oldway

                      Comment


                      • #12
                        Liegt es daran, dass die DLL auf C# basiert?
                        ja, das ist ja kein Maschinencode, sondern Bytecode
                        Christian

                        Comment


                        • #13
                          Ich konnte das Problem bisher immernoch nicht lösen.
                          Wir haben es zwar hinbekommen eine C# dll zu benutzen (kompilieren als unmanaged) und ich kann z.B. folgende Funktionen erfolgreich aufrufen:
                          Code:
                                 [DllExport("TestMethod2", CallingConvention = CallingConvention.StdCall)]
                                  public static int TestMethod2(int index)
                                  {
                                      return index;
                                  }
                          
                                  [DllExport("TestMethod3", CallingConvention = CallingConvention.StdCall)]
                                  public static char TestMethod3(int index)
                                  {
                                      char result = 't';
                                      if (index == 1)
                                          result = 'p';
                          
                                      return result;
                                  }
                          Aber bei folgender bekomme ich eine externe exception E0434F4D:
                          Code:
                                  [DllExport("GetUuidCharByArrayIndex", CallingConvention = CallingConvention.StdCall)]
                                  public static char GetUuidCharByArrayIndex(int index)
                                  {
                                      return (char)MachineInfo.Uuid.ToString().ToCharArray().GetValue(index);
                                  }
                          Code für Aufruf:
                          Code:
                          	typedef int (*TTestMethod)();
                          	typedef int (*TTestMethod2)(int);
                          	typedef char (*TTestMethod3)(int);
                          	typedef char (*TGetUuidCharByArrayIndex)(int);
                          
                          	HINSTANCE DllInstance;
                          	DllInstance = LoadLibrary("C:\\Program Files (x86)\\Borland\\CBuilder6\\Projects\\DllImport\\Conworx.Environment.Unmanaged.dll");
                          	if (DllInstance) {
                          		Application->MessageBoxA("DllInstance geladen", "Geladen");
                          
                          		TTestMethod TestMethod = (TTestMethod)GetProcAddress(DllInstance,"TestMethod");
                          		if (TestMethod) {
                          			int i = TestMethod();
                          			Label1->Caption = "i = " + AnsiString(i);
                          		} else {
                          			Application->MessageBoxA("Methode TestMethod nicht gefunden", "Nicht gefunden");
                          		}
                          
                          		TTestMethod2 TestMethod2 = (TTestMethod2)GetProcAddress(DllInstance,"TestMethod2");
                          		if (TestMethod2) {
                          			int i = TestMethod2(5000);
                          			Label2->Caption = "i = " + (AnsiString)i;
                          		} else {
                          			Application->MessageBoxA("Methode TestMethod2 nicht gefunden", "Nicht gefunden");
                          		}
                          
                          		TTestMethod3 TestMethod3 = (TTestMethod3)GetProcAddress(DllInstance,"TestMethod3");
                          		if (TestMethod3) {
                          			char a = TestMethod3(1);
                          			Label2->Caption = "a = " + (AnsiString)a;
                          		} else {
                          			Application->MessageBoxA("Methode TestMethod3 nicht gefunden", "Nicht gefunden");
                          		}
                          
                          		TGetUuidCharByArrayIndex GetUuidCharByArrayIndex = (TGetUuidCharByArrayIndex)GetProcAddress(DllInstance,"GetUuidCharByArrayIndex");
                          		if (GetUuidCharByArrayIndex) {
                          			int i = 65;
                          			char a = GetUuidCharByArrayIndex(i);
                          			Label2->Caption = "i = " + AnsiString(a);
                          		} else {
                          			Application->MessageBoxA("Methode GetUuidCharByArrayIndex nicht gefunden", "Nicht gefunden");
                          		}
                          	}

                          Comment

                          Working...
                          X