Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. How to call Registeration-Free COM dll?
Forum Updated to NodeBB v4.3 + New Features

How to call Registeration-Free COM dll?

Scheduled Pinned Locked Moved Solved General and Desktop
36 Posts 4 Posters 6.7k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • hskoglundH Offline
    hskoglundH Offline
    hskoglund
    wrote on last edited by
    #26
    This post is deleted!
    1 Reply Last reply
    0
    • hskoglundH Offline
      hskoglundH Offline
      hskoglund
      wrote on last edited by
      #27

      Hi, I had written a post above where I more or less gave up, but I made another effort!

      It turns out that that ancient Qt enhancement suggestion speaking about manifest files wasn't completely science-fiction. I found this MSDN article and of course some StackOverflow posts helped a lot.

      Thanks to your ProcMon trace above we can see it haplessly looking for DataTypesLibrary.dll's type library in the registry. By adding manifest files we can provide a path to that type library.

      Actually we need two manifest files. The first you'll add to your TestRegFreeCOM.exe. I'm assuming you're using MSVC 64-bits compiler and ..pro file (not CMake).
      Qt already adds an .rc file to your .exe so we also need to remove that (there can only be one manifest). Add this to your TestRegFreeCOM.pro:

      CONFIG -= embed_manifest_exe
      QMAKE_MANIFEST = $$PWD/TestRegFreeCOM.exe.manifest
      

      then create a text file TestRegFreeCOM.exe.manifest in your project dir with this:

      <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
      <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
        <dependency>
          <dependentAssembly>
            <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" 
             version="6.0.0.0" 
      	publicKeyToken="6595b64144ccf1df"
      	language="*"
      	processorArchitecture="*" />
          </dependentAssembly>
        </dependency>
        <dependency>
          <dependentAssembly>
            <assemblyIdentity 
              name="DataTypesLibrary.X" 
              version="1.0.0.0" 
              type="win32" 
      	language="*"
             processorArchitecture="*" />
      </dependentAssembly>
        </dependency>
        <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
          <security>
            <requestedPrivileges>
              <requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
            </requestedPrivileges>
          </security>
        </trustInfo>
      </assembly>
      

      most of the contents is because we're replacing the Qt standard manifest with our own. The relevant part is where we add a dependentAssembly for the DataTypesLibrary. I think the old MSDN article I mentioned above started this trend of suffixing an .X, don't worry it works :-)

      The second manifest file is for the DataTypesLibrary.dll, create a text file called DataTypesLibrary.X.manifest with this:

      <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
      <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
       <assemblyIdentity 
          name="DataTypesLibrary.X" 
          version="1.0.0.0" 
          type="win32"
         processorArchitecture="AMD64" />
      
        <file name="DataTypesLibrary.dll">
        <comClass
          progid="EventData"
          clsid="{0405e972-093d-4f16-9b4f-f9071cc8f9b2}"
          threadingModel = "Apartment" />
      
         <typelib tlbid="{A9D4AEA1-46D8-4E98-B9AA-BE93A21A58AD}"
          version="1.0" 
          helpdir="" />
      
        </file>
      </assembly>
      

      then put the DataTypesLibrary.X.manifest and DataTypesLibrary.dll both in the same directory as TestRegFreeCOM.exe.

      To test, try something like:

      auto comObject = new QAxObject("EventData");
      qDebug() << comObject->generateDocumentation();
      

      If it fails, you can trace the manifest fiddling with the SXSTrace.exe tool, step 1, start the trace in a separate CMD window:
      sxstrace trace -logfile:sxstrace
      irun TestRegFreeCOM.exe and press Enter to stop the trace
      step 2: decode the trace
      sxxtrace parse -logfile:sxstrace -outfile:trace.txt
      then you can type trace.txt

      If this works for you, you owe me a beer :-))

      Bruce.ZhangB 2 Replies Last reply
      1
      • hskoglundH hskoglund

        Hi, I had written a post above where I more or less gave up, but I made another effort!

        It turns out that that ancient Qt enhancement suggestion speaking about manifest files wasn't completely science-fiction. I found this MSDN article and of course some StackOverflow posts helped a lot.

        Thanks to your ProcMon trace above we can see it haplessly looking for DataTypesLibrary.dll's type library in the registry. By adding manifest files we can provide a path to that type library.

        Actually we need two manifest files. The first you'll add to your TestRegFreeCOM.exe. I'm assuming you're using MSVC 64-bits compiler and ..pro file (not CMake).
        Qt already adds an .rc file to your .exe so we also need to remove that (there can only be one manifest). Add this to your TestRegFreeCOM.pro:

        CONFIG -= embed_manifest_exe
        QMAKE_MANIFEST = $$PWD/TestRegFreeCOM.exe.manifest
        

        then create a text file TestRegFreeCOM.exe.manifest in your project dir with this:

        <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
          <dependency>
            <dependentAssembly>
              <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" 
               version="6.0.0.0" 
        	publicKeyToken="6595b64144ccf1df"
        	language="*"
        	processorArchitecture="*" />
            </dependentAssembly>
          </dependency>
          <dependency>
            <dependentAssembly>
              <assemblyIdentity 
                name="DataTypesLibrary.X" 
                version="1.0.0.0" 
                type="win32" 
        	language="*"
               processorArchitecture="*" />
        </dependentAssembly>
          </dependency>
          <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
            <security>
              <requestedPrivileges>
                <requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
              </requestedPrivileges>
            </security>
          </trustInfo>
        </assembly>
        

        most of the contents is because we're replacing the Qt standard manifest with our own. The relevant part is where we add a dependentAssembly for the DataTypesLibrary. I think the old MSDN article I mentioned above started this trend of suffixing an .X, don't worry it works :-)

        The second manifest file is for the DataTypesLibrary.dll, create a text file called DataTypesLibrary.X.manifest with this:

        <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
         <assemblyIdentity 
            name="DataTypesLibrary.X" 
            version="1.0.0.0" 
            type="win32"
           processorArchitecture="AMD64" />
        
          <file name="DataTypesLibrary.dll">
          <comClass
            progid="EventData"
            clsid="{0405e972-093d-4f16-9b4f-f9071cc8f9b2}"
            threadingModel = "Apartment" />
        
           <typelib tlbid="{A9D4AEA1-46D8-4E98-B9AA-BE93A21A58AD}"
            version="1.0" 
            helpdir="" />
        
          </file>
        </assembly>
        

        then put the DataTypesLibrary.X.manifest and DataTypesLibrary.dll both in the same directory as TestRegFreeCOM.exe.

        To test, try something like:

        auto comObject = new QAxObject("EventData");
        qDebug() << comObject->generateDocumentation();
        

        If it fails, you can trace the manifest fiddling with the SXSTrace.exe tool, step 1, start the trace in a separate CMD window:
        sxstrace trace -logfile:sxstrace
        irun TestRegFreeCOM.exe and press Enter to stop the trace
        step 2: decode the trace
        sxxtrace parse -logfile:sxstrace -outfile:trace.txt
        then you can type trace.txt

        If this works for you, you owe me a beer :-))

        Bruce.ZhangB Offline
        Bruce.ZhangB Offline
        Bruce.Zhang
        wrote on last edited by
        #28

        @hskoglund This really works now. That's very kind of you. Pretty much thanks. I owe you a beer^_^.

        1 Reply Last reply
        0
        • Bruce.ZhangB Bruce.Zhang has marked this topic as solved on
        • hskoglundH hskoglund

          Hi, I had written a post above where I more or less gave up, but I made another effort!

          It turns out that that ancient Qt enhancement suggestion speaking about manifest files wasn't completely science-fiction. I found this MSDN article and of course some StackOverflow posts helped a lot.

          Thanks to your ProcMon trace above we can see it haplessly looking for DataTypesLibrary.dll's type library in the registry. By adding manifest files we can provide a path to that type library.

          Actually we need two manifest files. The first you'll add to your TestRegFreeCOM.exe. I'm assuming you're using MSVC 64-bits compiler and ..pro file (not CMake).
          Qt already adds an .rc file to your .exe so we also need to remove that (there can only be one manifest). Add this to your TestRegFreeCOM.pro:

          CONFIG -= embed_manifest_exe
          QMAKE_MANIFEST = $$PWD/TestRegFreeCOM.exe.manifest
          

          then create a text file TestRegFreeCOM.exe.manifest in your project dir with this:

          <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
          <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
            <dependency>
              <dependentAssembly>
                <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" 
                 version="6.0.0.0" 
          	publicKeyToken="6595b64144ccf1df"
          	language="*"
          	processorArchitecture="*" />
              </dependentAssembly>
            </dependency>
            <dependency>
              <dependentAssembly>
                <assemblyIdentity 
                  name="DataTypesLibrary.X" 
                  version="1.0.0.0" 
                  type="win32" 
          	language="*"
                 processorArchitecture="*" />
          </dependentAssembly>
            </dependency>
            <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
              <security>
                <requestedPrivileges>
                  <requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
                </requestedPrivileges>
              </security>
            </trustInfo>
          </assembly>
          

          most of the contents is because we're replacing the Qt standard manifest with our own. The relevant part is where we add a dependentAssembly for the DataTypesLibrary. I think the old MSDN article I mentioned above started this trend of suffixing an .X, don't worry it works :-)

          The second manifest file is for the DataTypesLibrary.dll, create a text file called DataTypesLibrary.X.manifest with this:

          <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
          <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
           <assemblyIdentity 
              name="DataTypesLibrary.X" 
              version="1.0.0.0" 
              type="win32"
             processorArchitecture="AMD64" />
          
            <file name="DataTypesLibrary.dll">
            <comClass
              progid="EventData"
              clsid="{0405e972-093d-4f16-9b4f-f9071cc8f9b2}"
              threadingModel = "Apartment" />
          
             <typelib tlbid="{A9D4AEA1-46D8-4E98-B9AA-BE93A21A58AD}"
              version="1.0" 
              helpdir="" />
          
            </file>
          </assembly>
          

          then put the DataTypesLibrary.X.manifest and DataTypesLibrary.dll both in the same directory as TestRegFreeCOM.exe.

          To test, try something like:

          auto comObject = new QAxObject("EventData");
          qDebug() << comObject->generateDocumentation();
          

          If it fails, you can trace the manifest fiddling with the SXSTrace.exe tool, step 1, start the trace in a separate CMD window:
          sxstrace trace -logfile:sxstrace
          irun TestRegFreeCOM.exe and press Enter to stop the trace
          step 2: decode the trace
          sxxtrace parse -logfile:sxstrace -outfile:trace.txt
          then you can type trace.txt

          If this works for you, you owe me a beer :-))

          Bruce.ZhangB Offline
          Bruce.ZhangB Offline
          Bruce.Zhang
          wrote on last edited by Bruce.Zhang
          #29

          @hskoglund Sorry for bother you again. I had other COM dlls written in CSharp. I picked one to operate via dumpcpp, but if I generate .h only using " --nometaobject", then will have link errors. but will succeed when generating both .h and cpp.

          The tlb and manifest files as follows:
          https://drive.google.com/file/d/1-2240-43cqiw-rmdVIJvBKnMedPGCKau/view?usp=sharing

          https://drive.google.com/file/d/1WoWapdes613jN86Eoy6EnrfXL-0fXWax/view?usp=sharing

          https://drive.google.com/file/d/1p20BSfeuuFCaFUmhfRZi6lnurLlVBO3x/view?usp=sharing

          1 Reply Last reply
          0
          • hskoglundH Offline
            hskoglundH Offline
            hskoglund
            wrote on last edited by
            #30

            Do you need to use dumpcpp?
            I think if you just write the manifest files using the .idl and try with the usual:

            auto comObject = new QAxObject("RecipeManagement");
            qDebug() << comObject->generateDocumentation();
            

            then you should be able to use QAxObject's dynamicall() and setProperty() etc. instead.

            Bruce.ZhangB 1 Reply Last reply
            0
            • hskoglundH hskoglund

              Do you need to use dumpcpp?
              I think if you just write the manifest files using the .idl and try with the usual:

              auto comObject = new QAxObject("RecipeManagement");
              qDebug() << comObject->generateDocumentation();
              

              then you should be able to use QAxObject's dynamicall() and setProperty() etc. instead.

              Bruce.ZhangB Offline
              Bruce.ZhangB Offline
              Bruce.Zhang
              wrote on last edited by Bruce.Zhang
              #31

              @hskoglund said in How to call Registeration-Free COM dll?:

              ");

              I choose dumpcpp just because it seems very convenient to do this, I don't need to remember each property.

              As C# COM dll doesn't has "DllGetClassObject", I could only call QLibrary("RecipeManagement.dll")->Load();

              After that if I exec below code, then failed.

               auto comObject = new QAxObject("RecipeManagement");
                          qDebug() << comObject->generateDocumentation();
              
              The outputs:
              
              onecore\com\combase\catalog\catalog.cxx(2394)\combase.dll!00007FFD5C9EEFD0: (caller: 00007FFD5C934E30) ReturnHr(1) tid(518c) 800401F3 Invalid class string
              onecore\com\combase\dcomrem\resolver.cxx(2299)\combase.dll!00007FFD5C8AE3BD: (caller: 00007FFD5C8AB2AE) ReturnHr(2) tid(518c) 80040154 Class not registered
              onecore\com\combase\dcomrem\resolver.cxx(2507)\combase.dll!00007FFD5C8AB2D6: (caller: 00007FFD5C8ADC25) ReturnHr(3) tid(518c) 80040154 Class not registered
              CoCreateInstance failure (Class not registered)
              QAxBase::setControl: requested control RecipeManagement could not be instantiated
              ""
              
              It was the same error if using 
              "comObject = new QAxObject("RecipeManagement.SystemSettings");"
              or other name declared in manifest.
              

              Although I can run using .h&.cpp generated by dumpcpp. but there will pop up error if I debug into it.

              屏幕截图 2023-08-24 095914.png

              If I just run the exe, will not popup any error dialog, and I can get correct output of
              qDebug() << recipe.GetAsJSON();

              1 Reply Last reply
              0
              • hskoglundH Offline
                hskoglundH Offline
                hskoglund
                wrote on last edited by
                #32

                Hi, just to make sure, you're not still doing those calls? like

                ...
                    HRESULT hr = regFreeGetDllClassObject(...
                // and 
                    hr = pClassFactory->CreateInstance(..
                etc.
                

                with manifest files you just need
                auto comObject = new QAxObject("RecipeManagement");

                which should be equivalent to using the .h & .cpp files generated by dumpcpp. I.e. if new QAxObject(..) fails then .h & .cpp files from dumpcpp should fail also (and the other way around).

                Bruce.ZhangB 1 Reply Last reply
                0
                • hskoglundH hskoglund

                  Hi, just to make sure, you're not still doing those calls? like

                  ...
                      HRESULT hr = regFreeGetDllClassObject(...
                  // and 
                      hr = pClassFactory->CreateInstance(..
                  etc.
                  

                  with manifest files you just need
                  auto comObject = new QAxObject("RecipeManagement");

                  which should be equivalent to using the .h & .cpp files generated by dumpcpp. I.e. if new QAxObject(..) fails then .h & .cpp files from dumpcpp should fail also (and the other way around).

                  Bruce.ZhangB Offline
                  Bruce.ZhangB Offline
                  Bruce.Zhang
                  wrote on last edited by Bruce.Zhang
                  #33

                  @hskoglund said in How to call Registeration-Free COM dll?:

                  RecipeManagement
                  Hi, sorry for late reply,
                  I didn't use below code snipet, as DllClassObject didn't exists in C# dll.

                  HRESULT hr = regFreeGetDllClassObject(...
                  

                  After I exec

                  auto comObject = new QAxObject("RecipeManagement");
                      qDebug() << comObject->generateDocumentation();
                  

                  Error message as follows:

                  onecore\com\combase\catalog\catalog.cxx(2394)\combase.dll!00007FFF9549EFD0: (caller: 00007FFF953E4E30) ReturnHr(1) tid(1454) 800401F3 Invalid class string
                  onecore\com\combase\dcomrem\resolver.cxx(2299)\combase.dll!00007FFF9535E3BD: (caller: 00007FFF9535B2AE) ReturnHr(2) tid(1454) 80040154 Class not registered
                  onecore\com\combase\dcomrem\resolver.cxx(2507)\combase.dll!00007FFF9535B2D6: (caller: 00007FFF9535DC25) ReturnHr(3) tid(1454) 80040154 Class not registered
                  CoCreateInstance failure (Class not registered)
                  QAxBase::setControl: requested control RecipeManagement could not be instantiated
                  ""
                  
                  1 Reply Last reply
                  0
                  • hskoglundH Offline
                    hskoglundH Offline
                    hskoglund
                    wrote on last edited by
                    #34

                    Hi, I looked at your RecipeManagement.manifest file, at the top I think it lacks the processorArchitecture, i.e. try changing to this:

                    ...
                    <assemblyIdentity
                                name="RecipeManagement"
                                version="1.0.0.0"
                                processorArchitecture="msil"
                                />
                    ...
                    

                    and make sure the manifest file is linked/embedded into the RecipeManagement.dll (you can use mt.exe to check).

                    Also, you can always use sxstrace to trace, place a QMessageBox just before
                    auto comObject = new QAxObject("RecipeManagement");
                    (see my sxstrace instructions above)

                    Bruce.ZhangB 1 Reply Last reply
                    0
                    • hskoglundH hskoglund

                      Hi, I looked at your RecipeManagement.manifest file, at the top I think it lacks the processorArchitecture, i.e. try changing to this:

                      ...
                      <assemblyIdentity
                                  name="RecipeManagement"
                                  version="1.0.0.0"
                                  processorArchitecture="msil"
                                  />
                      ...
                      

                      and make sure the manifest file is linked/embedded into the RecipeManagement.dll (you can use mt.exe to check).

                      Also, you can always use sxstrace to trace, place a QMessageBox just before
                      auto comObject = new QAxObject("RecipeManagement");
                      (see my sxstrace instructions above)

                      Bruce.ZhangB Offline
                      Bruce.ZhangB Offline
                      Bruce.Zhang
                      wrote on last edited by
                      #35

                      @hskoglund The error code still the same.
                      The output file of sxstrace parse is empty.

                      and here is the XML of exe:

                      <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
                      <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
                          <dependency>
                              <dependentAssembly>
                                  <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" publicKeyToken="6595b64144ccf1df" language="*" processorArchitecture="*"></assemblyIdentity>
                              </dependentAssembly>
                          </dependency>
                          <dependency>
                              <dependentAssembly>
                                  <assemblyIdentity name="DataTypesLibrary" version="1.0.0.0" type="win32" language="*"></assemblyIdentity>
                              </dependentAssembly>
                          </dependency>
                          <dependency>
                              <dependentAssembly>
                                  <assemblyIdentity name="RecipeManagement" version="1.0.0.0" type="win32" language="*"></assemblyIdentity>
                              </dependentAssembly>
                          </dependency>
                          <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
                              <security>
                                  <requestedPrivileges>
                                      <requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
                                  </requestedPrivileges>
                              </security>
                          </trustInfo>
                      </assembly>
                      
                      1 Reply Last reply
                      0
                      • hskoglundH Offline
                        hskoglundH Offline
                        hskoglund
                        wrote on last edited by
                        #36

                        Hi, the XML/manifest for the .exe, you forgot the "X" - suffix, it is necessary for reg-free COM to work, try change the XML to:

                        <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
                        <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
                            <dependency>
                                <dependentAssembly>
                                    <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" publicKeyToken="6595b64144ccf1df" language="*" processorArchitecture="*"></assemblyIdentity>
                                </dependentAssembly>
                            </dependency>
                            <dependency>
                                <dependentAssembly>
                                    <assemblyIdentity name="DataTypesLibrary.X" version="1.0.0.0" type="win32" language="*" processorArchitecture="*"></assemblyIdentity>
                                </dependentAssembly>
                            </dependency>
                            <dependency>
                                <dependentAssembly>
                                    <assemblyIdentity name="RecipeManagement.X" version="1.0.0.0" type="win32" language="*" processorArchitecture="*"></assemblyIdentity>
                                </dependentAssembly>
                            </dependency>
                            <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
                                <security>
                                    <requestedPrivileges>
                                        <requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
                                    </requestedPrivileges>
                                </security>
                            </trustInfo>
                        </assembly>
                        

                        You already have a DataTypesLibrary.X.manifest file that works the DataTypesLibrary.dll written in C++
                        I think you should try the same with your C# RecipeManagement.dll, i.e. create a RecipeManagement.X.manifest file with something like this in it:

                        <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
                        <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
                         <assemblyIdentity 
                            name="RecipeManagement.X" 
                            version="1.0.0.0" 
                            type="win32"
                           processorArchitecture="msil" />
                        
                        <file name="RecipeManagement.dll">
                        
                        <clrClass
                            clsid="{B0AFB6EB-67CB-457E-8709-B6384B02558B}"
                            threadingModel="Both"
                            name="RecipeManagement.SystemSettings"
                            runtimeVersion="v4.0.30319" />
                        
                        <comClass
                            progid="RecipeManagement.SystemSettings"
                            clsid="{B0AFB6EB-67CB-457E-8709-B6384B02558B}"
                            threadingModel = "Apartment" />
                        
                          </file>
                        </assembly>
                        

                        I'm just guessing, but try first with a separate RecipeManagement.X.manifest file (not embedded in the .dll) with the above contents. Also I don't know if <clrClass> should be inside or outside the <filename XML line, you could try both.
                        Note that you also need the <typelib tlibid=xxx XML inside the <file.. (see my example above for the DataTypesLibrary.X.manifest) but that you can do a later step.

                        About the empty sxstrace trace.txt log file, yes sometimes it doesn't work and gives an empty log file, try logging in/out or rebooting your PC. When it works it will show traces for other ,exe files like edge,exe as well so you'll have to scroll/search for your file.
                        Note: there's a typing error above, here are the commands again:

                        sxstrace trace -logfile:sxstrace
                        sxstrace parse -logfile:sxstrace -outfile:trace.txt
                        
                        1 Reply Last reply
                        0

                        • Login

                        • Login or register to search.
                        • First post
                          Last post
                        0
                        • Categories
                        • Recent
                        • Tags
                        • Popular
                        • Users
                        • Groups
                        • Search
                        • Get Qt Extensions
                        • Unsolved