Поиск:

Ответ в темуСоздание новой темы Создание опроса
> создание и вызов окна из dll, как заставить dll открывать готовое окно 
V
    Опции темы
RussianHero
  Дата 18.11.2008, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 14.8.2007
Где: г. Балашиха, МО

Репутация: нет
Всего: нет



Всем привет 8)
В общем, облазил весь гугл, так ничего путного и не нашел.. сам уже тоже замучался искать, вот, обращаюсь за помощью:
Создал как-то dll-ку, как написано на ферстстепс.ру - все отлично работает.. но там она банальная, и мне этого хватала, я получал строку, в дллке обрабатывал и отсылал обратно.
Делал это вообще смешно, без использования визарда для МФЦ и длл, а вот так вот:
файл Х.h
Код

//#include "windows.h"
#include "afxwin.h" // MFC Основные и стандартные компоненты
#include "afxext.h"     // MFC Расширения
//#include "stdafx.h"

extern "C"
{
    void WINAPI MyTest(CString str);
}


файл Х.def
Код

; X.def
     EXPORTS
     MyTest    @1


файл X.cpp
Код

#include "Х.h"

void WINAPI MyTest(char *str)
{    


Дальше этого перестало хватать... В том плане, что теперь мне необходимо, чтобы, во время обработки получаемой строки, при выполнении условия было то-то, а при несоблюдении мне нужно вызвать диалоговое окно, в котором будет таблица, содержащая результаты обработки и т.п. 
На нормальном проекте (.ехе) я все отработал, и работу с CListCtrl и все-все-все... Так что код уеня уже готовый есть. Все что мне необходимо каким-то образом добавить в ресурс файл (создать новый точнее) диалог. и организовать его вывод, при несоблюдении моего условия. дальше уж я найду его инициализацию и т.п. и добавлю туда мой код.
Вы не представляете какой это геморрой..
Надеюсь на вашу помощь. 
А если еще и скажете, как сделать норм длл( с помощью визарда, а не с помощью .def), то вообще буду радоваться как младенец 8)
Заранее благодарю.
PM MAIL WWW ICQ   Вверх
jonie
Дата 19.11.2008, 01:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



читать там 
http://www.codersource.net/mfc_dll_tutorial.html
и там:
http://www.codeguru.com/cpp/cpp/cpp_mfc/tu...ticle.php/c4017

и вообще, если разделять логику и вид, то по хорошему зачем в считающем коде "окна" ? возвращайте ошибку из кода длл, и показывайте результаты в основной программе имхо..


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
voov
Дата 19.11.2008, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Патамушта мы пилоты
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 29.11.2007

Репутация: 8
Всего: 8



Я делал подобную штуку. Вот тема. Если будут вопросы, постараюсь помочь.
PM MAIL   Вверх
RussianHero
Дата 19.11.2008, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 14.8.2007
Где: г. Балашиха, МО

Репутация: нет
Всего: нет



Спасибо за ссылки, изучил..много чего узнал, но вот какая незадача - набил пример прямо из первой ссылки:
Create an MFC AppWizard Dll. Choose the option of Regular MFC DLL - Dynamically Linked to MFC. 
After the application gets created, add a header file and a source file to the application. The article assumes the file names to be utilities.h, utilities.cpp. 
Enter a function declaration inside the header file utilities.h with the following syntax. 
Код

__declspec(dllexport) int AddValues(int a, int b);

Add the function definition inside the utilities.cpp file as follows. 
--------------------------------------------------------------------------------
Код

int AddValues(int a, int b)
{
       return a+b;
}

Compile the MFC DLL application. This will produce a ProjectName.lib and ProjectName.dll in the debug folder. These two files are enough for using inside an application. 

И он не работает.. выдает ошибку:
Error Message 
fatal error C1010: unexpected end of file while looking for precompiled header directive
и указывает это на конец цппшного файла на закрывающуюся скобку...
На что в МСДН сказано: Did you forget to add '#include name' to your source?  smile 
Они че, издеваются? 8)
Карчое, так ДЛЛ не смог собрать 8( как сказано в первой ссылке
ПОтом зашел на вторую ссыль.. там побольше.. я чего-то поколдовал, потом понял, в чем я ступил идобавил в цппшный файл строчку #include "stdafx.h"
Все стало компилироваться 8)
собралось ДЛЛ... тока вот не пашет ничего...
Объясняю:
у меня програмулька, которая использует ВБА для скриптинга... в ней я делаю вот что:
Код

Declare Sub ААА Lib "ХХХ.dll" (ByVal stroka As String)
AAA ("Привет!")

и после создания ДЛЛ выше указанным образом стала выдавать ошибку, что функция ААА не найдена...
Вот содержание cpp:
#include "stdafx.h"
void ААА(CString str)
{    
...
}
Вот содержание h файла:
__declspec(dllexport) void AAA(CString str);

Правильно ли я все сделал?
Создал МФЦ ДЛЛ проект с помощью визарда. Потом добавил по пустому файлу cpp и h (напимер bbb.cpp и  bbb.h) в этот проект. Содержание их изложил выше... 
В cpp файл самого проекта (кот создался по умолчанию визардом) добавил
 #include "BBB.h"

Всё!
Люди добрые, скажите, почему функция не видится...


2jonie: в считающем коде окно потому, что при обработке может возникнуть массив, который я не хочу передавать в программу, а хочу сразу вывести и предложить выбрать пользователю что-то из него и на основе этого выбора - продолжить работу функции... так что окно мне тут просто необходимо.

2voov: Ну так если делал подобную штуку, помоги 8)
Я уже с ума схожу.

PM MAIL WWW ICQ   Вверх
RussianHero
Дата 20.11.2008, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 14.8.2007
Где: г. Балашиха, МО

Репутация: нет
Всего: нет



Люди, ну помогите хоть кто-нибудь.. неужели никто не делал длл и не вызывал из нее функциб в ВБА или где-то еще...?
PM MAIL WWW ICQ   Вверх
Kallikanzarid
Дата 21.11.2008, 03:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 240
Регистрация: 9.11.2008

Репутация: нет
Всего: 3



2 RussianHero:
По идее, достаточно просто убедиться, что библиотека регистрирует класс окна (например, в DllMain) а потом создавать окна этого класса через CreateWindow. Но это только в том случае, если не нужна MFC-я обертка окна. Если нужна, придется экспортировать класс через __declspec(dllexport/dllimport)
PM MAIL   Вверх
voov
Дата 21.11.2008, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Патамушта мы пилоты
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 29.11.2007

Репутация: 8
Всего: 8



Про ВБА ничего сказать не могу, а почему функция не видится предположение есть.
Из дллки ты ее экспортируешь
Код

__declspec(dllexport) void AAA(CString str);

а в проге, которая использует длл, не импортируешь функцию
Код

__declspec(dllimport) void AAA(CString str);


Добавлено через 3 минуты и 48 секунд
Цитата(RussianHero @  19.11.2008,  18:18 Найти цитируемый пост)
2voov: Ну так если делал подобную штуку, помоги 8)
Я уже с ума схожу.

Я же ссылку дал. Есть вопросы - задавай.
PM MAIL   Вверх
RussianHero
Дата 21.11.2008, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 14.8.2007
Где: г. Балашиха, МО

Репутация: нет
Всего: нет



Kallikanzarid, в том-то все и дело, что мне МФЦ нуженЮ, так как как я уже сказал - у меня уже все гвотово в экзешнике.. мне надо тока это перенести в ДЛЛку... а в экзешнике и CString и  CDialog и CListCtrl...

voov, ой, я как-то проглядел ссылку вашу 8)
Сейчас гляну...
ПО поводу "а в проге, которая использует длл, не импортируешь функцию"
В проге где я это использую - а это ВБА(можете сам открыть эксель и создать макрос) не нужно ничего импортировать.. ВБА очень и очень дружелюбен.. все, что надо там сделать - это 
Declare Sub ААА Lib "ХХХ.dll" (ByVal stroka As String)
AAA ("Привет!")
 и все, все будет работать... 8)

Добавлено через 12 минут и 59 секунд
voov, 
Прочел тот топик, который Вы указали... Спасибо, информативно на счет окна.. тока я пытаюсь пока что разобраться как сделать просто дллку, хоть какую-то, чтобы видна была в ВБА 8)
И разобрался-таки!!! Пригляделся, что в проекте визардом создался еще и def файл, в которм:

; AAA.def : Declares the module parameters for the DLL.
LIBRARY      "AAA"
DESCRIPTION  AAA Windows Dynamic Link Library'
EXPORTS
    ; Explicit exports can go here

Не долго думая, сделал то, что они хотят.. засунул сюда непонятный код из моей прошлой ДЛЛки:
    ; AAA.def
     EXPORTS
     AAA    @1

И, о чудо! Никаких пятен!!!
Функция стала видна и вызывается из ВБА!!!
Елки палки-то.. почему нигде нельзя взять, что же это за (извиняюсь) хрень... какая-то @1 ...!!!
и то, просто пока что вызвал функцию.. начала запускаться, но в конце ошибку выдала.. сейчас буду разбираться в чем дело...
PM MAIL WWW ICQ   Вверх
RussianHero
Дата 21.11.2008, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 14.8.2007
Где: г. Балашиха, МО

Репутация: нет
Всего: нет



Люди, гугл действительно творит чудеса:
http://www.vbstreets.ru/Projects/Graphics/66394.aspx
не считая первых двух абзацев здесь как раз сообщается как создавать ДЛЛки с экспортируемыми фунциями для работы в других приложениях!!!!

PM MAIL WWW ICQ   Вверх
RussianHero
Дата 21.11.2008, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 14.8.2007
Где: г. Балашиха, МО

Репутация: нет
Всего: нет



Такс, ну вроде бы с посмтроением ДЛ разобрались 8)
теперь к главной теме: 
открываю ResourseView и делаю insert->Dialog
называю его IDD_RESULTDIALOG
в файле Resourse.h появляется строка
Код

#define IDD_RESULTDIALOG                4000

в моей функции пишу:
Код

    CDialog about(IDD_RESULTDIALOG);    // создаем объект класса диалогового окна
    if (about.DoModal()==IDOK )
        AfxMessageBox("Ok");    // пользователь выбрал OK
    else
        AfxMessageBox("Cancel");    // пользователь выбрал Canсel

при компиляции вот такая вот ошибка:
error C2065: 'IDD_RESULTDIALOG' : undeclared identifier

В чем дело??
В обычном экзешном проекте я так стоздавал окна...

Добавлено через 13 минут и 1 секунду
Сделал так:
#include "Resource.h"    // Идентификаторы ресурсов

скомпилировалось без ошибок, а вот как начинаю билдить - то 81 ошибка и 82 еррора... 8(
Что ж не так-то???
PM MAIL WWW ICQ   Вверх
RussianHero
Дата 21.11.2008, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 14.8.2007
Где: г. Балашиха, МО

Репутация: нет
Всего: нет



Понял в чем дело, почитал
http://support.microsoft.com/default.aspx?...b;EN-US;Q148652
... просто сделал билд - релиз, а не дебаг - все нормально...
Тока вот 
Код

    CDialog about(IDD_RESULTDIALOG);
    about.DoModal();

как-то проскакивает.. ничего не создает..... Есть идеи?

Добавлено через 9 минут и 52 секунды
Сделал сейчас вот как:
Код

CDialog* pDialog;

       pDialog = new CDialog;
   //Check if new succeeded and we got a valid pointer to a dialog object
   if(pDialog != NULL)
   {
      BOOL ret = pDialog->Create(IDD_RESULTDIALOG, NULL);
      if(!ret)   //Create failed.
         AfxMessageBox("Error creating Dialog");
      pDialog->ShowWindow(SW_SHOW);
   }
   else
      AfxMessageBox("Error Creating Dialog Object");


сказало: Error Creating Dialog Object

Почему???
PM MAIL WWW ICQ   Вверх
voov
Дата 21.11.2008, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Патамушта мы пилоты
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 29.11.2007

Репутация: 8
Всего: 8



Цитата(RussianHero @  21.11.2008,  16:15 Найти цитируемый пост)
при компиляции вот такая вот ошибка:
error C2065: 'IDD_RESULTDIALOG' : undeclared identifier

вопрос тоже был в моей теме. смотри здесь и следующие 2 поста.

PM MAIL   Вверх
RussianHero
Дата 22.11.2008, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 14.8.2007
Где: г. Балашиха, МО

Репутация: нет
Всего: нет



voov, я конечно еще раз посмотрю(в понедельник-вторник) на счет того, что я сказал визарду, но вроде бы все верно...
"Создал класс для этого диалога CGraphRTDlg." - видите ли, дело в том, что у Вас тут целый класс отдельный для этого окна, а у меня вообще нету ничего кроме пустого, создающегося по умолчанию, диалог бокса. Мне не нужен особый класс для этого, меня CDialog вполне устраивает. Все, что мне нужно, чтобы он по стандарту отрисовал мне мой IDD_RESULTDIALOG.
То биш вот такиз вот конструкций :
Код

CGraphRTDlg::CGraphRTDlg(CWnd* pParent /*=NULL*/) : CDialog(IDD_DIALOG_GRAPHSETTINGS, pParent) {
}

у меня нет. Все, что у меня есть - 
Код

   CDialog about(IDD_RESULTDIALOG);
    about.DoModal();

и я не понимаю, почему это не работает и почему вот тут вот:
Код

CDialog* pDialog;
       pDialog = new CDialog;

не создается указатель.
Но гвоорю, посмотрю еще на всякий случай, что я сказал визарду...
PM MAIL WWW ICQ   Вверх
KEHT
Дата 23.11.2008, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 17.7.2006

Репутация: 1
Всего: 1



Цитата

В проге где я это использую - а это ВБА(можете сам открыть эксель и создать макрос) не нужно ничего импортировать.. ВБА очень и очень дружелюбен..

Почему бы вам не использовать Automation?

Это сообщение отредактировал(а) KEHT - 23.11.2008, 18:18
PM MAIL   Вверх
voov
Дата 24.11.2008, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Патамушта мы пилоты
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 29.11.2007

Репутация: 8
Всего: 8



RussianHero, а какого типа проект ты создал для длл? И какие настройки проекта, который использует длл? Как подключается МФЦ, статически или динамически?
Если можешь, выложи проект, посмотрим. Интересно стало. Поидее должно работать.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0567 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.