![]() |
*DirectX* | DShow и С++, проблема с линковкой программ
Кто работать с библиотеками ДиректХ (в особености DirectShow) из под С/С++?
Под Делфи 6/7 всё гладко проходит. Начал писать под С++ (среда Visual Studio 6.0), однако сразу напоролса на сложности. Проект компилируется, а при попитке получить ЕХЕ линковщик сбоит error LNK2001 unresolved external symbol. Хотя текст файл официально опубликован на Микрософт Спасибо за внимание. P/S Вот сам код где пробуем играть видео файл посредство DShow в среде С++ Код:
#include <dshow.h> |
Admiral
Эта ошибка означает, что компилятор не находит реализацию (т.е. непосредственно точку входа в объектном коде) какой-то из использованных функций. Все WinAPI функции, конечно реализованны в соответствующих системных .dll, но компилятор то об этом не знает и даже не умеет напрямую из dll функции импортировать (вернее, раньше не умел, а сейчас с помощью специальных прагм это возможно, вроде. Но нестандартно совсем). Поэтому создаются специальные .lib-заглушки для системных вызовов. Наиболее часто используемые обычно добавляются IDE в проект при его создании автоматически. Я бы поставил на то, что у вас не подключена к проекту ole32.lib, в которой находятся заглушки для CoCreateInstance и иже с ним. Но точно можно будет сказать, если вы приведёте весь текст ошибки, где указывается в том числе и не найденное имя, а по имени уже можно найти и библиотеку соответствующую. |
ivank
Спасибо за ответ. Теперь стало понятно где искать проблему. Цитата:
Цитата:
А на счёт Цитата:
Код:
main.obj : error LNK2001: unresolved external symbol _IID_IVideoWindow Я полагаю что опытный сишних ориентируэтса где в какой бибилиотеке что прописано... А начальный? Мануалы читать? А какой оператор можно использовать в коде для подключения библиотек (что б было видно непосредственно, а не так через Project->Settings (ALT+F7))? И почему при добавлении /stack:0x200000,0x200000 /subsystem:windows /machine:I386 /ignore:4089 /ignore:4078 в Project Options выдайотса аналогичная ошибка Код:
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16 Р.S Спасибо за вступительную теорию. А то я сомневался, что MSVS 6.0 весь битый и ничего путёвого в нём реально не напишиш (напишеш но не получиш ЕХЕ). В Делфи как то проше, но для системных прог С++, как мне кажетса, лутше предназначен. |
Во-первых, моё предположение всё таки оказалось ложным. Т.к. не найдена была не функция, а экспортируемые переменные. Поскольку гуиды по сути своей шестнадцатибайтные стркутуры, то им надо где-то храниться. Хранят и задают значение _одному_ экземпляру структуры, которй описан/хранится в соответствующем объектном модуле (библиотеке в данном случае), в остальных местах на него тольок _ссылаются_. Поэтому если не слинковать программу с соответствующим файлом, то эти ссылки останутся ни к чему не привязанными, что и произошло. Опять же с помощью расшерений MSVC можно приписать IID/GUID прямо к интерфейсу в месте его описания. Что не есть стандартно.
Цитата:
Цитата:
Цитата:
Цитата:
В принципе можно выделить два типа приложение - консольные и windows. Первые это /subsystem:console. При этом линкер создаёт точку входа в программу, в которой инициализируются стандартные библиотеки, включая ввод-вывод на консоль (наверное, консоль тоже создаётся заодно) и затем вызывается функция main. Второй тип приложений - windows приложения. /subsystem:windows. При этом линкером создаётся точка входа в программу, в которой то же что-то инициализируется и затем вызывается функция WinMain, консоль при этом не создаётся. Соответственно, у вас д.б. функция WinMain с четырьмя параметрами, а не main. Всё. |
Когда мне нехватает unresolved external XXXX, я ищу файлы *.lib, содержащие текст XXXX и указываю их линкеру. У меня Metrowerks CodeWarrior 8.0. Там достаточно *.lib к проекту добавить.
|
А как передать программе имя файла который надо проиграть?
Взять к примеру параметры функции main(int argc, char* argv[]). В коде hr = pGraph->RenderFile(L"C:\\Example.avi", NULL) второй параметр должен быть типа const unsigned short * , а в фунции main второй (и т.д) параметр типа char* . Если заменить main(int argc, char* argv[]) на main(int argc, const unsigned short * argv[]) (что естественно нарушает порядок функции main()) программа запустится (только с параметром, без параметров выдаст ошибку), но проигрывать нечего не будет (что и не удивительно ведь main() нарушен). Значит, работать надо со строчкой чтения файла (в самой программе - L"C:\\Example.avi"где L– это приведение типа как я понял). Если кто знает как можно ещё реализировать , то поделитесь кодом плиз. Спасибо за внимание. |
На сколько я понял, второй параметр (это должно быть написано в *.h) описан как BSTR* или WSTR*, что по сути - одно и тоже, short*. Скорее вего имеется ввиду уникодовская строка.
Код:
//#include <string> |
К 1000му просмотру темы, публикую решение. Впрочем, именно сабжевое было найдено ещё тогда – программа линковалась. Просто аппетит возрос и захотелось немного усложнить программу сабжа.
Решение: использовать в коде директивы компилятору #pragma, а в данном конкретном случаи #pragma comment( lib, "strmiids" ) как подсказал ivank. Так же можно подключить через меню, как описано в посте №3 Как найти нужную? Либо искать аналогичные проекты, просматривать документацию или искать по содержимому как рекомендует pva И самое главное, нужно чётко знать какой сейчас проект: консольный, где main рулит, или оконный, где WinMain уже. Тогда не будет проблемы линкования как в посте №3. Регистр имеет значение: пишем main с меленькой буквы. pva я воспользовался функцией MultiByteToWideChar и всё заработало как я того хотел. Выходит параметры приложения воспринимаются кодом как набор байтов, которые она и конвертит в символы. Как её используют нашёл в этом проекте -> http://csclab.murraystate.edu/bob.pi...py/asfcopy.cpp. Вот её описание в MSDN -> http://msdn.microsoft.com/en-us/library/ms776413.aspx Цитата:
Вот собственно код, который линкуется и работает как я хотел. Код:
#pragma comment( lib, "strmiids" ) Цитата:
ivank, pva премного благодарен. |
Время: 21:44. |
Время: 21:44.
© OSzone.net 2001-