Отговори на тема  [ 15 мнения ] 
Използване на DLL от Delphi в MS Visual C++ 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение Използване на DLL от Delphi в MS Visual C++
Проблема е следния, написал съм един DLL (с Delphi заради няколкото визуални елемента които ползвам постоянно), искам съответния DLL да ползвам в application направен с Visual C++. Дотук проблем няма, правя прототип на функцията:

Код:
typedef UINT (CALLBACK* LPFNDLLFUNC1)(bool);

която в DLL е написана така:

Код:
function MyFunc(parameter: boolean): integer;

Зареждам DLL с LoadLibrary(), намирам адреса на функцията MyFunc чрез GetProcAddress() и я извиквам без проблем, всичко работи. Това обаче е run-time варианта (explicit linking както се нарича)...тоест, DLL библиотеката се зарежда в момента в който извикам LoadLibrary(). В случая искам да използвам функциите от DLL-а статично (implicit linking), правя прототип на функцията MyFunc в .h файл:

Код:
#ifdef DM_XP_EXPORTS
#define DM_XP_API __declspec(dllexport)
#else
#define DM_XP_API __declspec(dllimport)
#endif

#ifdef __cplusplus
extern "C" {
#endif

UINT MyFunc(bool parameter);

#ifdef __cplusplus
}
#endif


Искам да извикам функцията при натискане на бутон, би трябвало да напиша:

Код:
void CMyAPP::OnButton1Click()
{ MyFunc(false);
}


За такова линкване обаче, Linker-a на MS Visual C++ иска .lib файл в който да са описани местата на функциите в DLL-а. Такъв файл обаче Delphi не може да генерира. Прочетох една камара обяснения за този файл, как мога да го генерирам с разни програми (DLL to Lib или IMPLIB32.EXE), или като направя .DEF файл, в който да опиша функциите с техните ordinal, при което изхода е все един и същи - някакъв странен по съдържание .lib файл който linker-a на C++ казва че не върши работа. Проблема не е толкова в Delphi, представете си го друго яче - имам DLL и .h файл с прототипите на функциите в него, искам да линкна статично (по време на компилиране) този DLL в BCB или MS Visual C++. Някаква идея как може да стане това ?


Чет Сеп 21, 2006 1:00 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 12:48 pm
Мнения: 6094
Мнение 
Пробвай това за DLLa

coff2omf.exe -lib:ms Packet.lib BPacket.lib


Чет Сеп 21, 2006 1:19 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
Каква е идеята на тоя coff2omf, зачетох из google, че обръща COFF или OBJ файлове в .lib, дай малко повече информация :)


Чет Сеп 21, 2006 1:28 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 12:48 pm
Мнения: 6094
Мнение 
С това си обърнах LIB от VC6 за Delphi, ама на теб ти трябва обратното - виж в хелпа дали се поддържа обратното
Не съм запознат много със VC-то ама май се правеше DEF файл за линка - от рода

LIBRARY "WIZPCAP"
DESCRIPTION 'WIZPCAP Windows Dynamic Link Library'
EXPORTS
GetDevices @1
OpenDevice @2


погледни и тук на тулс
http://www.digitalmars.com/ctg/coffimplib.html


Чет Сеп 21, 2006 1:34 pm
Профил ICQ
Ранг: Ориентиран
Ранг: Ориентиран
Аватар

Регистриран на: Пон Яну 09, 2006 11:32 am
Мнения: 276
Местоположение: Kozloduy
Мнение 
Само да попитам не трябва ли в делфито като пишеш функцията следнея да напишеш cdecl или нещо такова,
напр: procedure Mouse(mx,my:integer); cdecl;


Чет Сеп 21, 2006 2:28 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
Функциите от DLL ги експортвам с stdcall, не е там проблема. Просто трябва да се направи .lib файл за статичното линкване, като се подаде към C++ linker-a, само че тоя файл го нямам, не мога и да го генерирам.


Чет Сеп 21, 2006 2:43 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 12:32 pm
Мнения: 8382
Местоположение: София
Мнение 
http://www.codeproject.com/dll/RegDLL.asp

Доста обширен туториъл за dll-ите.


Чет Сеп 21, 2006 4:33 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Юни 03, 2005 9:39 pm
Мнения: 2277
Мнение 
lib /def:libname.dll :P


Чет Сеп 21, 2006 4:37 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
syscop написа:
lib /def:libname.dll
Това последното генерира някакъв lib файл само, че линкера пак казва, че не намира референс към функцията, а в lib файла не виждам имената на функциите вътре.


Чет Сеп 21, 2006 10:55 pm
Профил
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Пон Апр 17, 2006 1:44 pm
Мнения: 291
Мнение 
От .dll не е задължително да може да стане .lib !
Иначе предполагам, че щом грешката е чак при линкера, то си дефинирал функцията като външна... (external).


Пет Сеп 22, 2006 12:07 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
Абе прочетете какво пиша бе хора :D

Функцията съм я дефинирал external, стои в DLL, искам DLL да е линкнат за Application-a при компилирането - implicit linking . Explicit linking е начина който аз предпочитам и ползвам винаги, в случая обаче искам да линкна статично DLL за програмата ми, трябва да генерирам .lib файл. Имам само DLL и прототипите на функциите в него в .h файл...


Пет Сеп 22, 2006 12:49 am
Профил
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Пон Апр 17, 2006 1:44 pm
Мнения: 291
Мнение 
lib.exe /VERBOSE /MACHINE:I386 /DEF:DEFNAME.def /OUT:LIBNAME.lib /NAME:DLLNAME.dll

Друг вариант е: http://www.pediy.com/tools/Editors/Dll2lib/dll2lib.rar (има и лек), обаче не съм го пробвал и незнам дали работи.


Пет Сеп 22, 2006 1:42 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение 
lib библиотеките на Borland и MicroSoft не са съвместими по файлов формат, MicroSoft естествено нямат такъв конвертор, Borland имат - implib.exe. Гледам, че в C++ Builder пише, че трябва да се използва опция -а, която добавяла съвместимост с библиотеките на MicroSoft.
/* -a Add '_' alias for cdecl functions for compatibility with Microsoft libraries */
Включваш ли тази опция ?

Какво налага да използваш изрично implicit linking ?

_________________
Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....


Пет Сеп 22, 2006 8:09 am
Профил WWW
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Май 08, 2007 4:43 pm
Мнения: 1
Мнение 
Ако ти се намира MASM поразгледай му Bin директорията, това дето ти трябва го има там, но определено не coff2bin, нито lib, а по-скоро implib. Поразтърси се в нета.

The IMPLIB utility creates import libraries used by LINK to link dynamic-link libraries with applications.

Syntax

IMPLIB [[options]] implibname {dllfile... | deffile...}

Options
Option Action

/H Option name: /H[[ELP]]. Calls QuickHelp for help on IMPLIB.
/NOI Option name: /NOI[[GNORECASE]]. Preserves case for entry names in DLLs.
/NOL Option name: /NOL[[OGO]]. Suppresses the IMPLIB copyright message.
/? Option name: /?. Displays a summary of IMPLIB command-line syntax.


Вто Май 08, 2007 4:57 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Яну 19, 2007 9:16 am
Мнения: 1063
Местоположение: путинофили: "иди н***й"
Мнение 
освен с LIB можеш да линкваш DLL статично с DEF файл

Пример:
MyDLL.DLL с public Proc1, ... ProcN

към DEF файла на твоето VC приложение добави:

IMPORTS
MyDll.Proc1
MyDll.Proc2
...
MyDll.ProcN

DEF файл най-лесно ще направиш с IMPDEF.EXE (Borland!) :)

Цитат:
Borland Impdef Version 3.0.22 Copyright (c) 1991, 2000 Inprise Corporation

Syntax: IMPDEF [options] destname[.def] srcname[.dll]
Options:
-a Add '_' alias for MS flavor cdecl functions
-h Emit hints



Пример:
impdef unidrv.DEF unidrv.dll

резултат UNIDRV.DEF:

Цитат:
LIBRARY UNIDRV

DESCRIPTION 'DDRV -- Universal Printer Driver Library'

EXPORTS
WEP @16 ; WEP
UNIGETCHARWIDTH @15 ; UNIGETCHARWIDTH
UNISTRETCHDIB @28 ; UNISTRETCHDIB
UNIENUMOBJ @7 ; UNIENUMOBJ
UNIBITBLT @1 ; UNIBITBLT
UNIDEVINSTALL @94 ; UNIDEVINSTALL
UNIDISABLE @4 ; UNIDISABLE
UNIEXTDEVICEMODEPROPSHEET @95 ; UNIEXTDEVICEMODEPROPSHEET
UNISTRETCHBLT @27 ; UNISTRETCHBLT
UNIEXTDEVICEMODE @90 ; UNIEXTDEVICEMODE
UNIOUTPUT @8 ; UNIOUTPUT
UNIDEVICEMODE @13 ; UNIDEVICEMODE
UNIENABLE @5 ; UNIENABLE
UNISCANLR @12 ; UNISCANLR
UNICONTROL @3 ; UNICONTROL
UNIEXTTEXTOUT @14 ; UNIEXTTEXTOUT
UNIDEVICESELECTBITMAP @29 ; UNIDEVICESELECTBITMAP
UNICREATEDIBITMAP @20 ; UNICREATEDIBITMAP
UNIBITMAPBITS @30 ; UNIBITMAPBITS
WRITESPOOLBUF @300 ; WRITESPOOLBUF
UNIREALIZEOBJECT @10 ; UNIREALIZEOBJECT
UNIADVANCEDSETUPDIALOG @93 ; UNIADVANCEDSETUPDIALOG
UNIDIBBLT @19 ; UNIDIBBLT
UNISTRBLT @11 ; UNISTRBLT
UNIENUMDFONTS @6 ; UNIENUMDFONTS
UNISETDIBITSTODEVICE @21 ; UNISETDIBITSTODEVICE
UNIDEVICECAPABILITIES @91 ; UNIDEVICECAPABILITIES
UNICOLORINFO @2 ; UNICOLORINFO
UNIPIXEL @9 ; UNIPIXEL


всъщност с IMPLIB.EXE (този път на MS) можеш да си направиш и LIB от DEF файла :)


Вто Май 08, 2007 6:00 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 15 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 3 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни