Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > error C2664: cannot convert parameter 2 from


Автор: malor 7.7.2011, 13:22
Подключаю в программе динамически GDI+. В хэдере указано;
typedef long(__stdcall*GDIPLUSSTARTUP)(unsigned long*, const GDIPLUS_STARTUP_INPUT*, void*);

Начало cpp-файла:
Код
#include "stdafx.h"
#include <Gdiplus.h>
#include "SaveScreen2.h"

GDIPLUSSTARTUP GdiplusStartup;
......... etc ............


Далее по коду есть строки в одной из функций:
Код
GdiplusStartupInput gps;
ZeroMemory(&gps, sizeof(GdiplusStartupInput));
gps.GdiplusVersion = 1;
if (GdiplusStartup(&m_gdipToken, &gps, NULL)) 
    m_gdipToken = 0;


Про 4-ю строку компилятор выдаёт:

Цитата
savescreen2.cpp(48) : error C2664: 'long (unsigned long *,const GDIPLUS_STARTUP_INPUT *,void *)' : cannot convert parameter 2 from 'GdiplusStartupInput *' to 'const GDIPLUS_STARTUP_INPUT *'
        Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
Как избавиться?

VS2008

Автор: baldina 7.7.2011, 13:59
Цитата(malor @  7.7.2011,  13:22 Найти цитируемый пост)
GDIPLUSSTARTUP GdiplusStartup;

зачем это?

Автор: bsa 7.7.2011, 14:06
Скажи пожалуйста, а символ GDIPLUSSTARTUP где-нибудь документирован? Я лично не нашел описания. А раз описания нет, то и пользоваться им нельзя.

Добавлено через 1 минуту и 20 секунд
Цитата(baldina @  7.7.2011,  13:59 Найти цитируемый пост)
зачем это? 

Он же написал, что динамически подключает GDI+.

Автор: baldina 7.7.2011, 14:34
Цитата(bsa @  7.7.2011,  14:06 Найти цитируемый пост)
Он же написал, что динамически подключает GDI+. 

верно... ох и много же придется руками делать...

malor, как у тебя GDIPLUS_STARTUP_INPUT описан? видимо он должен быть GdiplusStartupInput, тогда этой ошибки не будет

Добавлено через 1 минуту и 47 секунд
Цитата(bsa @  7.7.2011,  14:06 Найти цитируемый пост)
символ GDIPLUSSTARTUP где-нибудь документирован? Я лично не нашел описания.

веорятно потому, что malor описание не выложил ;-)

Автор: malor 7.7.2011, 21:05
Все было выложено:
Код
struct GdiplusStartupInput        // for snapshot
{
    int GdiplusVersion; 
    int DebugEventCallback;
    int SuppressBackgroundThread;
    int SuppressExternalCodecs; 
};


bsa>>А раз описания нет, то и пользоваться им нельзя.

Компилятор ругался на const, а не на то, что что-то не объявлено.

Автор: bsa 8.7.2011, 00:12
Цитата(malor @  7.7.2011,  21:05 Найти цитируемый пост)
Компилятор ругался на const, а не на то, что что-то не объявлено. 

Поверь мне, преобразование из Type* в const Type* происходит молча и без проблем. А вот преобразование Type1* в Type2* далеко не всегда возможно.

Автор: mes 8.7.2011, 00:21
Цитата(malor @  7.7.2011,  20:05 Найти цитируемый пост)
Все было выложено:


Цитата(malor @  7.7.2011,  12:22 Найти цитируемый пост)
from 'GdiplusStartupInput *' to 'const GDIPLUS_STARTUP_INPUT *'

как соотноосятся эти два типа друг к другу (typedef?) должно быть известно в точке использования (там, где возникла ошибка)..

Автор: volatile 8.7.2011, 00:46
Цитата(mes @  8.7.2011,  00:21 Найти цитируемый пост)
как соотноосятся эти два типа друг к другу 

mes, они никак не соотносятся  smile 
Это две разные структуры:
Код

struct GdiplusStartupInput        // for snapshot
{
    int GdiplusVersion; 
    int DebugEventCallback;
    int SuppressBackgroundThread;
    int SuppressExternalCodecs; 
};

Код

typedef struct
{
    unsigned int GdiplusVersion;
    DEBUGEVENTPROC DebugEventCallback;
    int SuppressBackgroundThread;
    int SuppressExternalCodecs;
} GDIPLUS_STARTUP_INPUT;


Заглянул в исходник - это что-то!
Кроме этих струкутр есть еще несколько копий их-же в разных *.h-никах
Посоветовать автору можно только учить язык.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)