Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как использовать Windows API в Qt
Форум на CrossPlatform.RU > Разработка > С\С++
peperoni
Подскажите как подключать динамически стандартные DLL Windows и использовать вызовы к функциям Windows API?
Полагаю нужно что-то прописать в файле проекта, но что кокретно так и не понял.
Например, как заставить в QtCreator скомпилиться и запуститься простенькому консольному приложению взятому из MSDN, использующего CryptoAPI.
Примерчик просто выводит список доступных криптопровайдеров на консоль. Проверил его в VisualStudio - все рабоате, в QtCreator бился с LIBS += ..., но так и не победил.
Нужно под MinGW. Выдает ошибку E:\PROG\Qt\untitled1\main.c:-1: ошибка: undefined reference to `CryptEnumProviders'
Вызовы к функция CryptoAPI в дальнейшем планируется использовать в программе написанной с ипользованием библиотеки Qt.

#include <stdio.h>
#include <windows.h>
#include <Wincrypt.h>

void main()
{

    //---------------------------------------------------------------
    // Copyright (c) Microsoft Corporation.  All rights reserved.
    // Declare and initialize variables.

    DWORD       cbName;
    DWORD       dwType;
    DWORD       dwIndex;
    CHAR        *pszName = NULL;

    // Print header lines for providers.
    printf("Listing Available Providers:\n");
    printf("Provider type\tProvider Name\n");
    printf("_____________\t__________________"
        "___________________\n");  

    //---------------------------------------------------------------
    // Loop through enumerating providers.
    dwIndex = 0;
    while(CryptEnumProviders(
           dwIndex,
           NULL,
           0,
           &dwType,
           NULL,
           &cbName
           ))
    {

        //-----------------------------------------------------------
        //  cbName returns the length of the name of the next
        //  provider. Allocate memory in a buffer to retrieve
        //  that name.

        if (!(pszName = (LPTSTR)LocalAlloc(LMEM_ZEROINIT, cbName)))
        {
           printf("ERROR - LocalAlloc failed\n");
           exit(1);
        }
        //-----------------------------------------------------------
        //  Get the provider name.
        if (CryptEnumProviders(
               dwIndex++,
               NULL,
               0,
               &dwType,
               pszName,
               &cbName
               ))
        {
            printf ("     %4.0d\t%s\n",dwType, pszName);
        }
        else
        {
            printf("ERROR - CryptEnumProviders failed.\n");
            exit(1);
        }
        LocalFree(pszName);

    } // End of while loop

    printf("\nProvider types and provider names "
        "have been listed.\n");
}
Iron Bug
смотришь, в какой библиотеке твоя функция - и подключаешь её. и так далее, пока не скомпилится. смотреть можно, например, в MSDN, в сети.

только нафига тогда юзать Qt, если WinAPI наглухо убивает кроссплатформенность программы?
peperoni
Если возможно, то можно конретно указать какие строчки нужно записать в файл проекта, чтобы запустился выше приведенный примерчик в QtCreator. Для "чайников" пожалуйста. Например, используемые функции CryptoAPI содержаться в библиотеке Advapi32.dll. Как сделать чтобы данная библиотека автоматически загружалась в момент запуска программы?
На а по поводу Qt - кросплатформенность это не единсвенное достоинство данного фреймвока.
Litkevich Yuriy
Цитата(peperoni @ 17.11.2013, 17:54) *
бился с LIBS += ..., но так и не победил.
приведи пример того как использовал, может ты ошибся всего на чуть-чуть.
kuzulis
Цитата
undefined reference to `CryptEnumProviders'


Эмм.. Вообще-то нету у MinGW этой функции, она не декларирована в его заголовках, следовательно ты ничего не прилинкуешь в этом случае.

Тебе нужно использовать QLoadLibrary для подгрузки Advapi32.dll, найти там свою ф-ю CryptEnumProviders() и юзать ее.

Хотя.. Можешь попробовать сделать LIBS += lAdvapi32 и посмотреть что будет..

ЗЫ: Хотя, сигнатура этой ф-ции присутствует в MinGW-шном файле libadvapi32.a.
Тогда, ИМХО, просто объяви ее у себя в коде и слинкуйся с lAdvapi32.. В этом случае #include <Wincrypt.h> не нужен.. :) Может сработает.
peperoni
Точно. Оказывается wincrypt.h который в Windows SDK отличается от того который в QtSDK для MinGW. В Qt SDK какой-то урезанный - не все функции описаны. Скопировал описание функций в исходник примерчика из Windows SDK и заработало! Самое интресное ничего не добавлял в файл проекта! Как только правильная библиотека загружается не понятно...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.