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


Автор: nas_alex 24.8.2004, 15:28
помогите !!!!!!
VC6
как вызвать ф-цию из DLL, зная имя и параметры?

Автор: Олег М 24.8.2004, 16:00
Загружаешь библиотеку ::LoadLibrary
Получаешь адрес функции по имени GetProcAddress
Преобразовываешь указатель и вызываешь

Автор: Конструктор 24.8.2004, 16:06
Например вызываем ф-цию int SomeFunc(int someparam);

Код


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

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

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


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

Автор: nas_alex 24.8.2004, 16:20
а можно на примере пояснить?

у меня 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)


Автор: Олег М 24.8.2004, 16:46
Цитата(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);

Автор: nas_alex 24.8.2004, 16:58
а через OLE это как?

Автор: Олег М 24.8.2004, 17:12
Цитата(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")

Получаются обычные классы.

Автор: nas_alex 24.8.2004, 17:25
Цитата
Код

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

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

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

это из-за чего и как можно отловить ошибку?

Автор: Олег М 25.8.2004, 07:08
Цитата(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));

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

Автор: Олег М 25.8.2004, 10:00
Цитата(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));

Всё. Соединяй, что я понаписал в свою прогу, подставляй имена какие надо - должно работать. А какие классы - посмотри в Ворде - запиши макрос - он тебе даст почти готовый текст программы - имена те же, чуть-чуть поменяй и переноси смело в Вижуал студию.

Автор: nas_alex 25.8.2004, 11:53
а для 2000 WORDа нет?

Автор: Олег М 25.8.2004, 12:16
Цитата(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

Автор: nas_alex 25.8.2004, 13:12
а как заменить строку на что-нибудь?

Автор: Олег М 25.8.2004, 13:20
Цитата(nas_alex @ 25.8.2004, 16:12)
а как заменить строку на что-нибудь?

Открой Ворд Запусти запись макроса, сделай то что тебе нужно и посмотри что он записал - названия функций такие же. Делай по аналогии. Это уже вопросы не по С++ а по VBA.

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