Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DLL, как вызвать функциюд из DLL 
:(
    Опции темы
nas_alex
Дата 24.8.2004, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



помогите !!!!!!
VC6
как вызвать ф-цию из DLL, зная имя и параметры?
PM MAIL   Вверх
Олег М
Дата 24.8.2004, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 10.6.2004
Где: Москва

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



Загружаешь библиотеку ::LoadLibrary
Получаешь адрес функции по имени GetProcAddress
Преобразовываешь указатель и вызываешь
PM MAIL ICQ   Вверх
Конструктор
Дата 24.8.2004, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 641
Регистрация: 12.5.2004
Где: Москва

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



Например вызываем ф-цию int SomeFunc(int someparam);

Код


HMODULE hDll;
int ( * pfnSomeFunc) (int);

hDll = LoadLibrary("some.dll"); //Грузим ДЛЛ
pfnSomeFunc = GetProcAddr(hDll , "SomeFunc");//Получаем адрес ф-ции

pfnSomeFunc(someparam);//Вызов


Вроде так. Только надо учесть что компиляторы искажают имена ф-ций в длл в зависимости от параметров. Как с этим бороться я не в курсах, потому юзаю DumpBin.

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


Шустрый
*


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

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



а можно на примере пояснить?

у меня DLL для работы с word, правда все описано под bulder...

функция называется Procedure create_doc(file1,file2:string;paramstr:pchar;kod:word);
// Процедура создание простого документа на основе
// подстановки в тексте текстовых строк на место строк-указателей.
// file1 - строка, содержащая имя текстового файла-шаблона.
// Файл-шаблон - обычный DOC или RTF текст, содержащий обычные текстовые
// строки (определяемые программистом), которые используются в качестве
// строк-указателей для последующей замены на смысловой текст.
// file2 - имя выходного файла.
// paramstr - строка, определяющая способ заполнения шаблона текстовой информацией.
// Например, если переменная paramstr содержит строку '#1|первая строка|#2|вторая строка',
// то выполнение процедуры
// create_doc('c:\hablon.rtf','c:\Документ.rtf','#1|первая строка|#2|вторая строка',1);
// приведет к замене в тексте "#1" и "#2" на текст "первая строка" и "вторая строка".
// kod - способ отображения текста (0,1,2,3)


PM MAIL   Вверх
Олег М
Дата 24.8.2004, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 10.6.2004
Где: Москва

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



Цитата(nas_alex @ 24.8.2004, 19:20)
у меня DLL для работы с word,

А через OLE не судьба? Если не судьба, то сделай примерно так
Код

typedef void (*CreateDocProc) (char *, char *, int);
........
CreateDocProc func=(CreateDocProc) GetProcAddr(hDll , "create_doc");
func("sdfsdf","sdfasdf",1);

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


Шустрый
*


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

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



а через OLE это как?
PM MAIL   Вверх
Олег М
Дата 24.8.2004, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 10.6.2004
Где: Москва

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



Цитата(nas_alex @ 24.8.2004, 19:58)
а через OLE это как?

С офисом поставляются СОМ-классы. Видел VBA? Так там всё через них делается. Так же их можно использовать и в С++. В борланде не знаю как цепляется - поищи, где-то видел уже дофига, а в Вижуал студии примерно так
Код
#import "С:\Program Files\Microsoft Office\Office\mso97.dll" rename_namespace("MSO97")
#import "С:\Program Files\Common Files\Microsoft Shared\VBA\VBEEXT1.OLB" rename_namespace("VBEEXT1")
#import "С:\Program Files\Microsoft Office\Office\MsWord8.olb" \
rename("ExitWindows","ExitWindowsX") rename_namespace("MICROSOFT_WORD_97")

Получаются обычные классы.
PM MAIL ICQ   Вверх
nas_alex
Дата 24.8.2004, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата
Код

typedef void (*CreateDocProc) (char *, char *, int);
........
CreateDocProc func=(CreateDocProc) GetProcAddr(hDll , "create_doc");
func("sdfsdf","sdfasdf",1);

сделал так, но при запуске выкидывает окно

MFC Application - обнаружена ошибка. Приложение будет закрыто. Приносим извинения за неудобства.

это из-за чего и как можно отловить ошибку?
PM MAIL   Вверх
Олег М
Дата 25.8.2004, 07:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 10.6.2004
Где: Москва

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



Цитата(nas_alex @ 24.8.2004, 20:25)
MFC Application - обнаружена ошибка. Приложение будет закрыто. Приносим извинения за неудобства.

Значит указатель на функцию как-то не так преобразовываешь - не те параметры, скорее всего. Ты точно так как у меня написал, что-ли? Если да, то зря - у тебя там совсем другая функция: create_doc(file1,file2:string;paramstr:pchar;kod:word);
string - это что? Указатель на строку, как в С? Или что-то другое. Если ты сам написал её в бейсике, то наверное надо добавить ByRef. Хотя точно не знаю, да и неточно тоже.
pchar - это char, АНСИ, или short, ЮНИКОДЕ?
word - это понятно - 2 байта.
И вообще, дурью не майся - работай через ОЛЕ (я так понял ты вижул студии работаешь):
Код

COleVariant v;
_ApplicationPtr app;
HRESULT hRes=app.CreateInstance(_T("Word.Application.8"));
app->Visible=TRUE;
DocumentsPtr docs;
_DocumentPtr doc=app->Documents->Add(COleVariant(szTemplateName));

PM MAIL ICQ   Вверх
nas_alex
Дата 25.8.2004, 07:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



а есть пример проги, которая через OLE, в WORD чего -нибудь кидает?
PM MAIL   Вверх
Олег М
Дата 25.8.2004, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 10.6.2004
Где: Москва

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



Цитата(nas_alex @ 25.8.2004, 10:58)
а есть пример проги, которая через OLE, в WORD чего -нибудь кидает?

В продолжение того кода - там прога читает что-то из базы данных и закидывает строчки в ворд (по-моему таблицу заполняет, уже созданную из шаблона)
Код

rs1.GetFieldValue(_T("Заголовок"),v);
app->Selection->TypeText(V_BSTRT(&v));
app->Selection->MoveRight(COleVariant((long)wdCell));

потом, в конце, что-то ещё делает, не помню что
Код

app->Selection->Tables->Item(1)->Select();
app->Selection->Cells->AutoFit();
app->Selection->MoveDown(COleVariant((long)wdLine),COleVariant(1L));

Всё. Соединяй, что я понаписал в свою прогу, подставляй имена какие надо - должно работать. А какие классы - посмотри в Ворде - запиши макрос - он тебе даст почти готовый текст программы - имена те же, чуть-чуть поменяй и переноси смело в Вижуал студию.
PM MAIL ICQ   Вверх
nas_alex
Дата 25.8.2004, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



а для 2000 WORDа нет?
PM MAIL   Вверх
Олег М
Дата 25.8.2004, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 10.6.2004
Где: Москва

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



Цитата(nas_alex @ 25.8.2004, 14:53)
а для 2000 WORDа нет?

Абсолютно также - для всех Вордов. Только создавать объект надо вот так
Код
HRESULT hRes=app.CreateInstance(_T("Word.Application"));

или - для офиса ХР
Код
HRESULT hRes=app.CreateInstance(_T("Word.Application.10"));

для 2000 наверное будет Word.Application.9
И библиотеку соответственно подключать другую, не MsWord8.OLB, а MSWORD.OLB или что-то другое - посмотри в "C:\Program Files\Microsoft Office\Office10" или 9
PM MAIL ICQ   Вверх
nas_alex
Дата 25.8.2004, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



а как заменить строку на что-нибудь?
PM MAIL   Вверх
Олег М
Дата 25.8.2004, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 10.6.2004
Где: Москва

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



Цитата(nas_alex @ 25.8.2004, 16:12)
а как заменить строку на что-нибудь?

Открой Ворд Запусти запись макроса, сделай то что тебе нужно и посмотри что он записал - названия функций такие же. Делай по аналогии. Это уже вопросы не по С++ а по VBA.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




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


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

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