| Автор |
Съобщение |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
 Използване на 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++. Някаква идея как може да стане това ?
|
| Чет Сеп 21, 2006 1:00 pm |
|
 |
|
TheWizard
Ранг: Форумен бог
Регистриран на: Сря Апр 27, 2005 12:48 pm Мнения: 6094
|
Пробвай това за DLLa
coff2omf.exe -lib:ms Packet.lib BPacket.lib
|
| Чет Сеп 21, 2006 1:19 pm |
|
 |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
Каква е идеята на тоя coff2omf, зачетох из google, че обръща COFF или OBJ файлове в .lib, дай малко повече информация 
|
| Чет Сеп 21, 2006 1:28 pm |
|
 |
|
TheWizard
Ранг: Форумен бог
Регистриран на: Сря Апр 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 |
|
 |
|
bobyk
Ранг: Ориентиран
Регистриран на: Пон Яну 09, 2006 11:32 am Мнения: 276 Местоположение: Kozloduy
|
Само да попитам не трябва ли в делфито като пишеш функцията следнея да напишеш cdecl или нещо такова,
напр: procedure Mouse(mx,my:integer); cdecl;
|
| Чет Сеп 21, 2006 2:28 pm |
|
 |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
Функциите от DLL ги експортвам с stdcall, не е там проблема. Просто трябва да се направи .lib файл за статичното линкване, като се подаде към C++ linker-a, само че тоя файл го нямам, не мога и да го генерирам.
|
| Чет Сеп 21, 2006 2:43 pm |
|
 |
|
Реконструктор
Ранг: Форумен бог
Регистриран на: Съб Сеп 25, 2004 12:32 pm Мнения: 8382 Местоположение: София
|
|
| Чет Сеп 21, 2006 4:33 pm |
|
 |
|
syscop
Ранг: Форумен бог
Регистриран на: Пет Юни 03, 2005 9:39 pm Мнения: 2277
|
lib /def:libname.dll 
|
| Чет Сеп 21, 2006 4:37 pm |
|
 |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
Това последното генерира някакъв lib файл само, че линкера пак казва, че не намира референс към функцията, а в lib файла не виждам имената на функциите вътре.
|
| Чет Сеп 21, 2006 10:55 pm |
|
 |
|
perlsite
Ранг: Ориентиран
Регистриран на: Пон Апр 17, 2006 1:44 pm Мнения: 291
|
От .dll не е задължително да може да стане .lib !
Иначе предполагам, че щом грешката е чак при линкера, то си дефинирал функцията като външна... (external).
|
| Пет Сеп 22, 2006 12:07 am |
|
 |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
Абе прочетете какво пиша бе хора
Функцията съм я дефинирал external, стои в DLL, искам DLL да е линкнат за Application-a при компилирането - implicit linking . Explicit linking е начина който аз предпочитам и ползвам винаги, в случая обаче искам да линкна статично DLL за програмата ми, трябва да генерирам .lib файл. Имам само DLL и прототипите на функциите в него в .h файл...
|
| Пет Сеп 22, 2006 12:49 am |
|
 |
|
perlsite
Ранг: Ориентиран
Регистриран на: Пон Апр 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 |
|
 |
|
nop
Ранг: Минаващ
Регистриран на: Вто Май 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 |
|
 |
|
ps66
Ранг: Форумен бог
Регистриран на: Пет Яну 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!)
Пример: impdef unidrv.DEF unidrv.dll резултат UNIDRV.DEF:
всъщност с IMPLIB.EXE (този път на MS) можеш да си направиш и LIB от DEF файла 
|
| Вто Май 08, 2007 6:00 pm |
|
|