Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. 3rd Party Software
  4. Using QLibrary Avicap("avicap32.dll"); A very strange behaviour.

Using QLibrary Avicap("avicap32.dll"); A very strange behaviour.

Scheduled Pinned Locked Moved 3rd Party Software
8 Posts 3 Posters 4.5k 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.
  • mrdebugM Offline
    mrdebugM Offline
    mrdebug
    wrote on last edited by
    #1

    This function wants to get the cameras list.

    @void MainWindow::on_pushButton_clicked() {
    QLibrary Avicap("avicap32.dll");
    typedef bool (*CapGetDriverDescription)(uint wDriverIndex, char *lpszName, int cbName, char *lpszVer, int cbVer);
    CapGetDriverDescription capGetDriverDescription= (CapGetDriverDescription)Avicap.resolve("capGetDriverDescriptionA");
    if (capGetDriverDescription) {
    for (int count= 0; count< 2; count++) {
    char szDeviceName[256];
    char szDeviceVersion[256];
    memset(szDeviceName, '\0', sizeof(szDeviceName));
    memset(szDeviceVersion, '\0', sizeof(szDeviceVersion));
    if (capGetDriverDescription(count, szDeviceName, sizeof(szDeviceName), szDeviceVersion, sizeof(szDeviceVersion))) {
    ui->textEdit->append(QString(szDeviceName));
    } else break;
    }
    }
    }@

    If I call the external function "capGetDriverDescriptionA" from 0 to 2 all works well. I obtain the name of the two cameras correctly.

    But if I go over 2 the program goes to crash.
    According to msdn the function "capGetDriverDescriptionA" returns true if the camera exists and false if the camera does not exists. If I comment out the row "ui->textEdit->append(QString(szDeviceName));" the program does not go to crash and I can query the function from 0 to 9.

    Is this possible? How can I obtain the cameras list?

    Now I'm using Qt 4.8.4 with mingw.

    Need programmers to hire?
    www.labcsp.com
    www.denisgottardello.it
    GMT+1
    Skype: mrdebug

    1 Reply Last reply
    0
    • JKSHJ Offline
      JKSHJ Offline
      JKSH
      Moderators
      wrote on last edited by
      #2

      You could have a memory access error somewhere in your program. The error might even be from outside of your 'on_pushButton_clicked()' function -- these bugs are a pain to find because they don't cause crashes immediately. It's probably unrelated to Qt itself.

      There are different things you can try to start debugging, such as

      • Attach a debugger to your program, to get a stack trace of the crash -- What functions are called, leading up to the crash?
      • Print out the contents of szDeviceName just before the crash site -- Does the output look correct?

      Note: It is possible that when you start debugging, the crashes mysteriously disappear.

      Qt Doc Search for browsers: forum.qt.io/topic/35616/web-browser-extension-for-improved-doc-searches

      1 Reply Last reply
      0
      • mrdebugM Offline
        mrdebugM Offline
        mrdebug
        wrote on last edited by
        #3

        I tried the function in a new empty project but does not work.
        Do you think that mingw is the cause?

        Need programmers to hire?
        www.labcsp.com
        www.denisgottardello.it
        GMT+1
        Skype: mrdebug

        1 Reply Last reply
        0
        • JKSHJ Offline
          JKSHJ Offline
          JKSH
          Moderators
          wrote on last edited by
          #4

          I'm not sure, actually. Have a look at http://qt-project.org/doc/qt-4.8/qlibrary.html#resolve -- it says[quote]The symbol must be exported as a C function from the library. This means that the function must be wrapped in an extern "C" if the library is compiled with a C++ compiler. On Windows you must also explicitly export the function from the DLL using the __declspec(dllexport) compiler directive[/quote]Does the DLL fit this criteria?

          You can try to link the DLL at compile-time instead of using QLibrary, by including Vfw.h in your .cpp file, "adding the library to your .pro file":http://qt-project.org/doc/qt-4.8/qmake-project-files.html#declaring-other-libraries, and calling the function directly in your code.

          Qt Doc Search for browsers: forum.qt.io/topic/35616/web-browser-extension-for-improved-doc-searches

          1 Reply Last reply
          0
          • mrdebugM Offline
            mrdebugM Offline
            mrdebug
            wrote on last edited by
            #5

            Solved but a very horrible solution!
            Look: you have to query for ten times the function "capGetDriverDescriptionA" defining "QLibrary Avicap("avicap32.dll");" each time.
            In "Enumerate" function you have to insert "Sleep(10);".
            Very strange but now works.

            @for (int count= 0; count< 10; count++) Enumerate(count);@

            @void MainWindow::Enumerate(int index) {
            QLibrary Avicap("avicap32.dll");
            typedef bool (*CapGetDriverDescription)(uint wDriverIndex, char *lpszName, int cbName, char *lpszVer, int cbVer);
            CapGetDriverDescription capGetDriverDescription= (CapGetDriverDescription)Avicap.resolve("capGetDriverDescriptionA");
            if (capGetDriverDescription) {
            char szDeviceName[80];
            char szDeviceVersion[80];
            memset(szDeviceName, '\0', sizeof(szDeviceName));
            memset(szDeviceVersion, '\0', sizeof(szDeviceVersion));
            if (capGetDriverDescription(index, szDeviceName, sizeof(szDeviceName), szDeviceVersion, sizeof(szDeviceVersion))) {
            ui->textEdit->append(QString(szDeviceName)+ ", "+ QString(szDeviceVersion));
            Sleep(10);
            } else ui->textEdit->append("Error!!!");
            }
            }@

            Need programmers to hire?
            www.labcsp.com
            www.denisgottardello.it
            GMT+1
            Skype: mrdebug

            1 Reply Last reply
            0
            • J Offline
              J Offline
              JBoy
              wrote on last edited by
              #6

              HI there,

              Im currently getting the very same behaviour, but thing is this little "Sleep(10)" doesn't fix the problem for me.

              Does someone have a clue of what could possibly cause this?

              @mrdebug did you find out another way of doing this?

              1 Reply Last reply
              0
              • mrdebugM Offline
                mrdebugM Offline
                mrdebug
                wrote on last edited by
                #7

                Yes, I did.
                Here you are:

                @#ifdef Q_OS_WIN
                #include "windows.h"
                #define __T(x) L ## x
                bool Enumerate(WORD index, QString &Name, QString &Version) {
                typedef BOOL WINAPI capGetDriverDescription(WORD wDriverIndex, LPTSTR lpszName, INT cbName, LPTSTR lpszVer, INT cbVer);
                capGetDriverDescription* capGetDriverDescriptionFunction= 0;
                HINSTANCE Avicap32Dll= 0;
                Avicap32Dll= LoadLibraryW(__T("avicap32.dll"));
                if (Avicap32Dll) {
                capGetDriverDescriptionFunction= (capGetDriverDescription*)GetProcAddress(Avicap32Dll, "capGetDriverDescriptionA");
                if (capGetDriverDescriptionFunction!= 0) {
                char lpszName[80];
                char lpszVer[80];
                if (capGetDriverDescriptionFunction(index, LPTSTR(lpszName), 80, LPTSTR(lpszVer), 80)) {
                Name= QString(lpszName);
                Version= QString(lpszVer);
                FreeLibrary(Avicap32Dll);
                return true;
                }
                }
                FreeLibrary(Avicap32Dll);
                }
                return false;
                }
                #endif@

                Need programmers to hire?
                www.labcsp.com
                www.denisgottardello.it
                GMT+1
                Skype: mrdebug

                1 Reply Last reply
                0
                • J Offline
                  J Offline
                  JBoy
                  wrote on last edited by
                  #8

                  Great that's very useful, thank you.

                  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