crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Как использовать Windows API в Qt
peperoni
  опции профиля:
сообщение 17.11.2013, 15:54
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 3
Регистрация: 17.11.2013
Пользователь №: 3979

Спасибо сказали: 0 раз(а)




Репутация:   0  


Подскажите как подключать динамически стандартные 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
  опции профиля:
сообщение 17.11.2013, 21:03
Сообщение #2


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


смотришь, в какой библиотеке твоя функция - и подключаешь её. и так далее, пока не скомпилится. смотреть можно, например, в MSDN, в сети.

только нафига тогда юзать Qt, если WinAPI наглухо убивает кроссплатформенность программы?

Сообщение отредактировал Iron Bug - 18.11.2013, 8:22
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
peperoni
  опции профиля:
сообщение 18.11.2013, 19:33
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 3
Регистрация: 17.11.2013
Пользователь №: 3979

Спасибо сказали: 0 раз(а)




Репутация:   0  


Если возможно, то можно конретно указать какие строчки нужно записать в файл проекта, чтобы запустился выше приведенный примерчик в QtCreator. Для "чайников" пожалуйста. Например, используемые функции CryptoAPI содержаться в библиотеке Advapi32.dll. Как сделать чтобы данная библиотека автоматически загружалась в момент запуска программы?
На а по поводу Qt - кросплатформенность это не единсвенное достоинство данного фреймвока.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 19.11.2013, 13:04
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(peperoni @ 17.11.2013, 17:54) *
бился с LIBS += ..., но так и не победил.
приведи пример того как использовал, может ты ошибся всего на чуть-чуть.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuzulis
  опции профиля:
сообщение 19.11.2013, 14:00
Сообщение #5


Активный участник
***

Группа: Участник
Сообщений: 393
Регистрация: 29.6.2009
Пользователь №: 862

Спасибо сказали: 36 раз(а)




Репутация:   7  


Цитата
undefined reference to `CryptEnumProviders'


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

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

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

ЗЫ: Хотя, сигнатура этой ф-ции присутствует в MinGW-шном файле libadvapi32.a.
Тогда, ИМХО, просто объяви ее у себя в коде и слинкуйся с lAdvapi32.. В этом случае #include <Wincrypt.h> не нужен.. :) Может сработает.

Сообщение отредактировал kuzulis - 19.11.2013, 14:05
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
peperoni
  опции профиля:
сообщение 19.11.2013, 16:56
Сообщение #6


Новичок


Группа: Новичок
Сообщений: 3
Регистрация: 17.11.2013
Пользователь №: 3979

Спасибо сказали: 0 раз(а)




Репутация:   0  


Точно. Оказывается wincrypt.h который в Windows SDK отличается от того который в QtSDK для MinGW. В Qt SDK какой-то урезанный - не все функции описаны. Скопировал описание функций в исходник примерчика из Windows SDK и заработало! Самое интресное ничего не добавлял в файл проекта! Как только правильная библиотека загружается не понятно...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 25.4.2024, 8:45