| Микроконтролери и електроника 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++. Дотук проблем няма, правя прототип на функцията:
която в DLL е написана така:
Зареждам DLL с LoadLibrary(), намирам адреса на функцията MyFunc чрез GetProcAddress() и я извиквам без проблем, всичко работи. Това обаче е run-time варианта (explicit linking както се нарича)...тоест, DLL библиотеката се зарежда в момента в който извикам LoadLibrary(). В случая искам да използвам функциите от DLL-а статично (implicit linking), правя прототип на функцията MyFunc в .h файл:
Искам да извикам функцията при натискане на бутон, би трябвало да напиша:
За такова линкване обаче, 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 |
|
| Автор: | Predator_MF [ Чет Сеп 21, 2006 10:55 pm ] | |||||||||
| Заглавие: | ||||||||||
|
||||||||||
| Автор: | perlsite [ Пет Сеп 22, 2006 12:07 am ] |
| Заглавие: | |
От .dll не е задължително да може да стане .lib ! Иначе предполагам, че щом грешката е чак при линкера, то си дефинирал функцията като външна... (external). |
|
| Автор: | Predator_MF [ Пет Сеп 22, 2006 12:49 am ] |
| Заглавие: | |
Абе прочетете какво пиша бе хора Функцията съм я дефинирал 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!)
Пример: impdef unidrv.DEF unidrv.dll резултат UNIDRV.DEF:
всъщност с IMPLIB.EXE (този път на MS) можеш да си направиш и LIB от DEF файла |
|||||||||||||||||||
| Страница 1 от 1 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|