Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Непонятная ошибка


Автор: Syltan 22.2.2010, 17:28
--------------------------------------------------------------------------------

Пробую написать подключаемый модуль к файловому менеджеру ФАР.
Программа, не хочет компилится, затсряла на непонятной ошибке
Плагин должен просто выдвигать/задвигать “язык” сидюка. 
Но код не компилится почему-то.
Код

//-------------
#include <windows.h>
#include <Mmsystem.h>

#include "plugin.hpp" // Этот заголовочный файл берётся из ..\Far\PlugDoc.rar

/*
Структура PluginStartupInfo должна быть в каждом plug-in'e
Far использует её для получения информации о модуле и
передачи информации в модуль.
*/
static struct PluginStartupInfo Info;

/* Экспортируемые функции */
extern "C"
{
/* Вызывается Far'ом для заполнения структуры PluginStartupInfo. */
void WINAPI _export SetStartupInfo (struct PluginStartupInfo *Info);
/* Главная функция плагина - вызывается при выборе плагина из списка,
который появляется при нажатии F11. */
HANDLE WINAPI _export OpenPlugin(int OpenFrom, int Item);
/* Вызывается Far'ом для получения информации о плагине.
Экземпляр структуры PluginInfo создаётся Far'ом, а
её адрес передаётся в GetPluginInfo. */
void WINAPI _export GetPluginInfo(struct PluginInfo *Info);
}
//-------------
/* Задаём пункты меню */
struct FarMenuItem MenuItems[2] =
{
{L"Open CD", /* Название пункта */
0, /* Признак того, что пункт выбран */
0, /* Если не 0 - слева ставится "галочка" -
(что-то вроде RadioGroup) */
0 /* Если не 0 - вместо пункта меню
ставится разделитель */
},
{L"Close CD",
0,
0,
0
}
};
//-------------
void WINAPI _export SetStartupInfo (struct PluginStartupInfo *Info)
{
::Info = *Info; /* Просто передаём указатель на нашу структуру,
чтобы Far знал где она лежит */
}
//-------------
void WINAPI _export GetPluginInfo(struct PluginInfo *Info)
{
Info->StructSize = sizeof(*Info);

static wchar_t *PluginMenuStrings[1];
PluginMenuStrings[0] = L"CD-ROM Functions"; /* Название плагина */

/* Добавляем пункт в меню, которое появляется при нажатии F11 */
Info->PluginMenuStrings = PluginMenuStrings;
Info->PluginMenuStringsNumber = 1; /* Добавили одну строку */
}
//-------------
HANDLE WINAPI _export OpenPlugin(int OpenFrom, int Item)
{
/* Вызываем меню и узнаём номер выбранного пункта */
int menu_item = Info.Menu (Info.ModuleNumber,
-1, // X - Default
-1, // Y - Default
0, // MaxHeight - Default
FMENU_AUTOHIGHLIGHT, /* Автоподсветка
при выборе*/
L"CD-ROM Menu", /* Заголовок меню */
L"Choose something", /* Строка снизу */
NULL, /* Ссылка на Help - его нет :) */
NULL, /* BreakKeys - по умолчанию нет */
NULL, /* BreakCode - см. пред. пункт. */
&MenuItems[0], /* Адрес структур
с пунктами меню */
2 /* Количество пунктов в меню */
);

switch(menu_item) /* в зависимости от номера выбранного пункта... */
{
case 0: /* Выдвигаем подставку для чашки с кофе :) */
mciSendString(L"Set CDAudio Door Open", 0, 0, 0);
break;
case 1: /* Задвигаем подставку для чашки с кофе :) */
mciSendString(L"Set CDAudio Door Closed", 0, 0, 0);
break;
}

/* Вообще-то здесь надо возвращать Handle plugin'a,
но всё и так прекрасно работает :))) */
return(INVALID_HANDLE_VALUE);
}
//-------------
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
//-------------



Выдаёт ошибку:
cd.obj : error LNK2019: unresolved external symbol __imp__mciSendStringW@16 referenced in function _OpenPlugin@8

Я так и не понял, не хаватет библиотеки winmm.dll ???
Я её скачал, как её подключить в студию, чтоб заработал этот проект, если конечено проблемма в том что нету этой библиотеки.
Я пробовал её кидать в папку с проектом, во все подпапки, всё равно выскакивает эта ошибка. 

Автор: artsb 22.2.2010, 18:28
mciSendString появилась только в Win2000. Под какой ОС вы запускаете?

Автор: Syltan 22.2.2010, 19:07
Программа вроде скомпилилась после. того как я прописалв самом начале строку:
Код

#pragma comment( lib, "winmm" )


У меня подключаема библиотека к фару работает, только не запускается на компах там где не стоитстудия 2008.
Как исправить ошибку?
Ещё проблемма небольшая.
Чтоб не прописывать эту строку, можно настроить в студии, но там я не нашёл в  меню input->Additional Dependecies
, файла winmm.dll,
который необходим для компиляции данной программы.
Вот фото, где я его хотел включить в программу.

http://riteaboutnow.filesurf.ru/20100222/00000007/aa7da1a4/bd0bb2ca/1.jpg
http://fatboy.filesurf.ru/20100222/00000007/8b6a8da7/fcf5cb7d/2.jpg

Автор: artsb 22.2.2010, 20:41
Syltan, http://www.dependencywalker.com/ поможет вам узнать чего не хватает на других компах.

Автор: Syltan 22.2.2010, 20:52
А если утилиты не будет под рукой, как это сделать в студии, в этом вопрос?

Автор: Syltan 22.2.2010, 21:41
Всё, ввроде скомпилил, но проблемма, в том, что программа не работает там где не установленная студия 2008.  Поддскжаите, что можно сделать?

Автор: ISergeyN 22.2.2010, 21:53
Цитата(Syltan @ 22.2.2010,  21:41)
Всё, ввроде скомпилил, но проблемма, в том, что программа не работает там где не установленная студия 2008.  Поддскжаите, что можно сделать?

http://forum.vingrad.ru/forum/topic-233481.html

Автор: Syltan 22.2.2010, 22:57
Скажите именно для компиляции длл, что выбрать необходимо из списка, по этой картинке.
Когда я выбираю Multi-threaded (/MT)
Программа выдаёт такую ошибку:

mt.exe : general error c101008a: Failed to save the updated manifest to the file ".\Debug\cd.dll.embed.manifest". 0@0<5B@ 7040= =525@=>.
Программа компилится только при выборе Multi-threaded DLL (/MD) и всё, больше никак.

Автор: artsb 23.2.2010, 12:15
Цитата(Syltan @  22.2.2010,  22:57 Найти цитируемый пост)
Когда я выбираю Multi-threaded (/MT)
Программа выдаёт такую ошибку:

Попробуйте "таскать с собой" библиотеку MSVCR80.dll и ещё какие там понадобятся.

Автор: Syltan 23.2.2010, 14:32
А чтоб не таскать ,есть вариант какой-то, чтоб можно было использовать длл, без всяких посредников:?

Автор: artsb 23.2.2010, 14:50
Выставить Multi-threaded. Но вы же пишете, что у вас не работает так...

Автор: Syltan 23.2.2010, 17:17
Да, действительно Mtd при компиляции на дебаге действительно помогло, только жалко что размер длл увеличился. 

Вот я захотел добавить ещё 1 пункт меню - "Выход из программы".
Программа, не хочет воспринимать функцию вывода диалоговых окон.
Я хочу чтоб при нажатии "выйти из программы", отображалось сообщение, 
если я подтверждаю, что согласен, тогда закрыть окно фар.

Что можно сделать?
Вот исходник:
Код

//-------------
#include <windows.h>
#include <Mmsystem.h>
 
#include "plugin.hpp" // Этот заголовочный файл берётся из ..\Far\PlugDoc.rar
 
/*
Структура PluginStartupInfo должна быть в каждом plug-in'e
Far использует её для получения информации о модуле и
передачи информации в модуль.
*/
static struct PluginStartupInfo Info;
 
/* Экспортируемые функции */
extern "C"
{
/* Вызывается Far'ом для заполнения структуры PluginStartupInfo. */
void WINAPI _export SetStartupInfo (struct PluginStartupInfo *Info);
/* Главная функция плагина - вызывается при выборе плагина из списка,
который появляется при нажатии F11. */
HANDLE WINAPI _export OpenPlugin(int OpenFrom, int Item);
/* Вызывается Far'ом для получения информации о плагине.
Экземпляр структуры PluginInfo создаётся Far'ом, а
её адрес передаётся в GetPluginInfo. */
void WINAPI _export GetPluginInfo(struct PluginInfo *Info);
}
//-------------
/* Задаём пункты меню */
struct FarMenuItem MenuItems[3] =
{
{L"Открыть CD-ROM", /* Название пункта */
0, /* Признак того, что пункт выбран */
0, /* Если не 0 - слева ставится "галочка" -
(что-то вроде RadioGroup) */
0 /* Если не 0 - вместо пункта меню
ставится разделитель */
},
{L"Закрыть CD-ROM",
0,
0,
0
},
{L"Выйти из проги",
0,
0,
0
}
};
//-------------
void WINAPI _export SetStartupInfo (struct PluginStartupInfo *Info)
{
::Info = *Info; /* Просто передаём указатель на нашу структуру,
чтобы Far знал где она лежит */
}
//-------------
void WINAPI _export GetPluginInfo(struct PluginInfo *Info)
{
Info->StructSize = sizeof(*Info);
 
static wchar_t *PluginMenuStrings[1];
PluginMenuStrings[0] = L"Функции CD-РОМА"; /* Название плагина */
 
/* Добавляем пункт в меню, которое появляется при нажатии F11 */
Info->PluginMenuStrings = PluginMenuStrings;
Info->PluginMenuStringsNumber = 1; /* Добавили одну строку */
}
//-------------
HANDLE WINAPI _export OpenPlugin(int OpenFrom, int Item)
{
/* Вызываем меню и узнаём номер выбранного пункта */
int menu_item = Info.Menu (Info.ModuleNumber,
-1, // X - Default
-1, // Y - Default
0, // MaxHeight - Default
FMENU_AUTOHIGHLIGHT, /* Автоподсветка
при выборе*/
L"CD-ROM Menu", /* Заголовок меню */
L"Choose something", /* Строка снизу */
NULL, /* Ссылка на Help - его нет :) */
NULL, /* BreakKeys - по умолчанию нет */
NULL, /* BreakCode - см. пред. пункт. */
&MenuItems[0], /* Адрес структур
с пунктами меню */
3 /* Количество пунктов в меню */
);
 
switch(menu_item) /* в зависимости от номера выбранного пункта... */
{
case 0: /* Выдвигаем подставку для чашки с кофе :) */
mciSendString(L"Set CDAudio Door Open", 0, 0, 0);

break;
case 1: /* Задвигаем подставку для чашки с кофе :) */
mciSendString(L"Set CDAudio Door Closed", 0, 0, 0);
break;
case 2:
if(MessageBox(0,L"Выйти из программы?","Информация",MB_YESNO |MB_ICONQUESTION) == IDYES)
Close();
break;
}
 
/* Вообще-то здесь надо возвращать Handle plugin'a,
но всё и так прекрасно работает :))) */
return(INVALID_HANDLE_VALUE);
}
//-------------
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
//-------------
 



c:\documents and settings\kasper\мои документы\visual studio 2008\projects\cd\cd\cd.cpp(97) : error C2664: 'MessageBoxW' : cannot convert parameter 3 from 'const char [11]' to 'LPCWSTR'
c:\documents and settings\kasper\мои документы\visual studio 2008\projects\cd\cd\cd.cpp(98) : error C3861: 'Close': identifier not found


Автор: artsb 24.2.2010, 13:00
Цитата(Syltan @  23.2.2010,  17:17 Найти цитируемый пост)
только жалко что размер длл увеличился. 

Так и должно быть.

Цитата(Syltan @  23.2.2010,  17:17 Найти цитируемый пост)
c:\documents and settings\kasper\мои документы\visual studio 2008\projects\cd\cd\cd.cpp(97) : error C2664: 'MessageBoxW' : cannot convert parameter 3 from 'const char [11]' to 'LPCWSTR'

Пробуйте так:
Код

MessageBox(0, L"Выйти из программы?", L"Информация",MB_YESNO | MB_ICONQUESTION)


Цитата(Syltan @  23.2.2010,  17:17 Найти цитируемый пост)
c:\documents and settings\kasper\мои документы\visual studio 2008\projects\cd\cd\cd.cpp(98) : error C3861: 'Close': identifier not found

Полностью согласен с компилером. Что за метод Close?

Автор: Syltan 24.2.2010, 14:11
Мне нужно закрыть программу фар, после того ,как я из меню, которое создал - "Выйти из проги", нажал на него, мне выдало таоке сообщение, если нажал ""ОК"", чтоб фар закрылся, вот такое надо. Просто клосе закрыват форму на с++ Билдере, а на студии как тогда?

Автор: bsa 24.2.2010, 14:16
Цитата(Syltan @  24.2.2010,  14:11 Найти цитируемый пост)
на студии как тогда? 
"На студии" это зависит от используемого API. Если речь про WinAPI, то нужно послать окну сообщение WM_CLOSE.

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