Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Използване на DLL от Delphi в MS Visual C++
http://mcu-bg.com/mcu_site/viewtopic.php?f=14&t=2932
Страница 1 от 1

Автор:  Predator_MF [ Чет Сеп 21, 2006 1:00 pm ]
Заглавие:  Използване на 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++. Някаква идея как може да стане това ?

Автор:  TheWizard [ Чет Сеп 21, 2006 1:19 pm ]
Заглавие: 

Пробвай това за DLLa

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

Автор:  Predator_MF [ Чет Сеп 21, 2006 1:28 pm ]
Заглавие: 

Каква е идеята на тоя coff2omf, зачетох из google, че обръща COFF или OBJ файлове в .lib, дай малко повече информация :)

Автор:  TheWizard [ Чет Сеп 21, 2006 1:34 pm ]
Заглавие: 

С това си обърнах 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

Автор:  bobyk [ Чет Сеп 21, 2006 2:28 pm ]
Заглавие: 

Само да попитам не трябва ли в делфито като пишеш функцията следнея да напишеш cdecl или нещо такова,
напр: procedure Mouse(mx,my:integer); cdecl;

Автор:  Predator_MF [ Чет Сеп 21, 2006 2:43 pm ]
Заглавие: 

Функциите от DLL ги експортвам с stdcall, не е там проблема. Просто трябва да се направи .lib файл за статичното линкване, като се подаде към C++ linker-a, само че тоя файл го нямам, не мога и да го генерирам.

Автор:  Реконструктор [ Чет Сеп 21, 2006 4:33 pm ]
Заглавие: 

http://www.codeproject.com/dll/RegDLL.asp

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

Автор:  syscop [ Чет Сеп 21, 2006 4:37 pm ]
Заглавие: 

lib /def:libname.dll :P

Автор:  Predator_MF [ Чет Сеп 21, 2006 10:55 pm ]
Заглавие: 

syscop написа:
lib /def:libname.dll
Това последното генерира някакъв lib файл само, че линкера пак казва, че не намира референс към функцията, а в lib файла не виждам имената на функциите вътре.

Автор:  perlsite [ Пет Сеп 22, 2006 12:07 am ]
Заглавие: 

От .dll не е задължително да може да стане .lib !
Иначе предполагам, че щом грешката е чак при линкера, то си дефинирал функцията като външна... (external).

Автор:  Predator_MF [ Пет Сеп 22, 2006 12:49 am ]
Заглавие: 

Абе прочетете какво пиша бе хора :D

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

Автор:  perlsite [ Пет Сеп 22, 2006 1:42 am ]
Заглавие: 

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 8:09 am ]
Заглавие: 

lib библиотеките на Borland и MicroSoft не са съвместими по файлов формат, MicroSoft естествено нямат такъв конвертор, Borland имат - implib.exe. Гледам, че в C++ Builder пише, че трябва да се използва опция -а, която добавяла съвместимост с библиотеките на MicroSoft.
/* -a Add '_' alias for cdecl functions for compatibility with Microsoft libraries */
Включваш ли тази опция ?

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

Автор:  nop [ Вто Май 08, 2007 4:57 pm ]
Заглавие: 

Ако ти се намира 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.

Автор:  ps66 [ Вто Май 08, 2007 6:00 pm ]
Заглавие: 

освен с 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 файла :)

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/