Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.02.2010, 17:40   #1
Syltan
Заблокирован
 
Регистрация: 27.08.2009
Сообщений: 569
По умолчанию #pragma argsused

Пробую написать подключаемый модуль к файловому менеджеру ФАР.
Программа, не хочет компилится, затсряла на #pragma argsused
Плагин должен просто выдвигать/задвигать “язык” сидюка.
Но код не компилится почему-то.
Код:
//-------------
#include <windows.h>
#include <mmsystem.h>
#pragma argsused
//-------------
#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] =
{
{"Open CD", /* Название пункта */
0, /* Признак того, что пункт выбран */
0, /* Если не 0 - слева ставится "галочка" -
(что-то вроде RadioGroup) */
0 /* Если не 0 - вместо пункта меню
ставится разделитель */
},
{"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 char *PluginMenuStrings[1];
PluginMenuStrings[0] = "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, /* Автоподсветка
при выборе*/
"CD-ROM Menu", /* Заголовок меню */
"Choose something", /* Строка снизу */
NULL, /* Ссылка на Help - его нет :) */
NULL, /* BreakKeys - по умолчанию нет */
NULL, /* BreakCode - см. пред. пункт. */
&MenuItems[0], /* Адрес структур
с пунктами меню */
2 /* Количество пунктов в меню */
);

switch(menu_item) /* в зависимости от номера выбранного пункта... */
{
case 0: /* Выдвигаем подставку для чашки с кофе :) */
mciSendString("Set CDAudio Door Open", 0, 0, 0);
break;
case 1: /* Задвигаем подставку для чашки с кофе :) */
mciSendString("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;
}
//-------------
Syltan вне форума Ответить с цитированием
Старый 21.02.2010, 18:35   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

В смысле застряла? argsused - это борландская вещь. Каким вы пользуетесь компилятором?
p51x вне форума Ответить с цитированием
Старый 21.02.2010, 20:32   #3
Syltan
Заблокирован
 
Регистрация: 27.08.2009
Сообщений: 569
По умолчанию

Я использую Visual Studio 2008.
Если убрать это: #pragma argsused

И написать так код:
Код:
//-------------
#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
Syltan вне форума Ответить с цитированием
Старый 22.02.2010, 06:38   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

А МСДН посмотреть???

Цитата:
Header: Declared in Mmsystem.h; include Windows.h.
Library: Use Winmm.lib.
p51x вне форума Ответить с цитированием
Старый 22.02.2010, 16:50   #5
Syltan
Заблокирован
 
Регистрация: 27.08.2009
Сообщений: 569
По умолчанию

Я так и не понял, не хаватет библиотеки winmm.dll ???
Я её скачал, как её подключить в студию, чтоб заработал этот проект, если конечено проблемма в том что нету этой библиотеки.
Я пробовал её кидать в папку с проектом, во все подпапки, всё равно выскакивает эта ошибка.
Syltan вне форума Ответить с цитированием
Старый 22.02.2010, 17:28   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Use Winmm.lib - ясно же написано. В свойствах проекта в настройках линкера добавьте.

А winmm.dll стандартная виндовая и есть в каждой винде изначально.

Хотя ва проще будет добавить:
Код:
#pragma comment( lib, "winmm" )
в начало и забыть...

Последний раз редактировалось p51x; 22.02.2010 в 17:34. Причина: Добавил прагму
p51x вне форума Ответить с цитированием
Старый 22.02.2010, 17:58   #7
Syltan
Заблокирован
 
Регистрация: 27.08.2009
Сообщений: 569
По умолчанию

Спасибо, вродес компилился код, толкьо я немогу понять, а зачем нужна эта библиотека для моего кода?

Подключить библиотеку не прописывая, не получилось почему-то, я делал это так:
Project->project properties->Linker
А там в линкере каталог целый.
Как подпункт выбрать, чтиоб подключить данную библиотеку без прописывания в коде?
Изображения
Тип файла: jpg clip_image002.jpg (40.3 Кб, 148 просмотров)
Syltan вне форума Ответить с цитированием
Старый 22.02.2010, 18:14   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

input - additional depend...

"толкьо я немогу понять, а зачем нужна эта библиотека для моего кода?"
Хотя бы для этого:
Код:
case 0: /* Выдвигаем подставку для чашки с кофе :) */
mciSendString(L"Set CDAudio Door Open", 0, 0, 0);
break;
case 1: /* Задвигаем подставку для чашки с кофе :) */
mciSendString(L"Set CDAudio Door Closed", 0, 0, 0);
break;
p51x вне форума Ответить с цитированием
Старый 22.02.2010, 18:36   #9
Syltan
Заблокирован
 
Регистрация: 27.08.2009
Сообщений: 569
По умолчанию

Спасибо, вроде программа рабтает так как надо, только. Если запустить этот фар на компе, там где не установленна студия, если запустить этот плагин, запустив фар и нажав ф11, выдаёт красное окно с ошибками.

Программа не работает там где не стоит студия 2008.



Ещё, скажите j,обязательно ли нужно создавать файл cd.def именно с таким описанием?
Код:

LIBRARY
EXPORTS
GetPluginInfoW=_GetPluginInfo@4
OpenPluginW=_OpenPlugin@8
SetStartupInfoW=_SetStartupInfo@4
Вы говорили, что чтоб не прописывать строку:
Код:
#pragma comment( lib, "winmm" )
Можно выбрать в меню input->Additional Dependecies, это файл и скомпилить. Вот меню, но я не нашёл там такого файла длл.
Изображения
Тип файла: jpg 1.jpg (48.8 Кб, 132 просмотров)
Тип файла: jpg 2.jpg (50.0 Кб, 131 просмотров)

Последний раз редактировалось Syltan; 22.02.2010 в 18:50.
Syltan вне форума Ответить с цитированием
Старый 22.02.2010, 18:49   #10
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

"Программа не работает там где не стоит студия 2008."
Поиск и гугл очень давно знают ответ.
Если кратко: Microsoft Visual C++ 2008 Redistrib..., статическая линковка, отказ от CRT...

Про деф:
Либо так, либо __declspec(dllexport) перед функциями.
p51x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
pragma Witaliy Общие вопросы Delphi 1 31.07.2008 16:00