Автор | Сообщение |
|
| постоянный участник
|
Пост N: 126
Зарегистрирован: 12.09.06
|
|
Отправлено: 04.12.06 11:06. Заголовок: Опять про DLL
Опять поднимаю вопрос об DLL. Хочу использовать harbour.dll, взял создал тестовую программу, "скормил" её hbmake, указал там [x] use xHarbour[.dll|.so] И не собирается. Выдает следующее сообщение: Z:\BCC55\BIN\ilink32 @makefile.lnk Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland Error: Unresolved external '_main' referenced from Z:\BCC55\LIB\C0X32.OBJ Подскажите, где че нужно подправить в скрипте. Мой скрипт test.bc такой: #BCC VERSION=BCB.01 !ifndef CC_DIR CC_DIR = $(MAKE_DIR) !endif !ifndef HB_DIR HB_DIR = $(HARBOUR_DIR) !endif RECURSE= NO COMPRESS = NO EXTERNALLIB = NO XFWH = NO FILESTOADD = 5 WARNINGLEVEL = 0 USERDEFINE = USERINCLUDE = GUI = NO MT = NO SRC02 = obj PROJECT = test.exe $(PR) OBJFILES = $(SRC02)\TEST.obj $(OB) PRGFILES = TEST.PRG $(PS) OBJCFILES = $(OBC) CFILES = $(CF) RESFILES = RESDEPEN = TOPMODULE = TEST.PRG LIBFILES = harbour.lib optcon.lib EXTLIBFILES = DEFFILE = HARBOURFLAGS = -w0 CFLAG1 = -OS $(CFLAGS) -d -c -L$(HB_DIR)\lib CFLAG2 = -I$(HB_DIR)\include;$(CC_DIR)\include RFLAGS = LFLAGS = -L$(CC_DIR)\lib\obj;$(CC_DIR)\lib;$(HB_DIR)\lib -Gn -M -m -s -Tpe -x -ap IFLAGS = LINKER = ilink32 ALLOBJ = c0x32.obj $(OBJFILES) $(OBJCFILES) ALLRES = $(RESDEPEN) ALLLIB = $(LIBFILES) import32.lib cw32.lib .autodepend #DEPENDS #COMMANDS .cpp.obj: $(CC_DIR)\BIN\bcc32 $(CFLAG1) $(CFLAG2) -o$* $** .c.obj: $(CC_DIR)\BIN\bcc32 -I$(HB_DIR)\include $(CFLAG1) $(CFLAG2) -o$* $** .prg.obj: $(HB_DIR)\bin\harbour -D__EXPORT__ -n -go -I$(HB_DIR)\include $(HARBOURFLAGS) -o$* $** .rc.res: $(CC_DIR)\BIN\brcc32 $(RFLAGS) $< #BUILD $(PROJECT): $(CFILES) $(OBJFILES) $(RESDEPEN) $(DEFFILE) $(CC_DIR)\BIN\$(LINKER) @&&! $(LFLAGS) + $(ALLOBJ), + $(PROJECT),, + $(ALLLIB), + $(DEFFILE), + $(ALLRES) !
|
|
|
Ответов - 25
, стр:
1
2
All
[только новые]
|
|
|
| Администратор
|
Пост N: 413
Зарегистрирован: 23.05.05
|
|
Отправлено: 04.12.06 16:17. Заголовок: Re:
вместо c0x32.obj надо прилинковать c0w32.obj
|
|
|
|
| постоянный участник
|
Пост N: 131
Зарегистрирован: 12.09.06
|
|
Отправлено: 04.12.06 20:07. Заголовок: Re:
А каким образом можно вызывать другие DLL, т.е. операторы подключения или вызовов ? И можно ли использовать DLL написанные на других языках, в частности на Delphi ? Покажите какой-нибудь пример. Спасибо заранее за подсказку.
|
|
|
|
| модератор
|
Пост N: 360
Зарегистрирован: 25.05.05
|
|
Отправлено: 04.12.06 20:37. Заголовок: Re:
Andrey пишет: цитата: | Покажите какой-нибудь пример. |
| В MiniGUI мы делаем это так: #include "minigui.ch" Function Main DEFINE WINDOW Win_1 ; AT 0,0 ; WIDTH 400 ; HEIGHT 400 ; TITLE 'Hello World!' ; MAIN DEFINE MAIN MENU DEFINE POPUP 'Test' MENUITEM 'Copy file' ACTION ( IF( COPYFILE ( "sample.wav" , "sample2.wav", 1 ) == 1, ; MsgInfo("File is copied"), MsgStop("File is exist") ) ) END POPUP END MENU END WINDOW ACTIVATE WINDOW Win_1 Return DECLARE DLL_TYPE_BOOL CopyFileA( DLL_TYPE_LPCSTR cExistingFileName, DLL_TYPE_LPCSTR cNewFileName, DLL_TYPE_LONG lFailIfExists ) ; IN KERNEL32.DLL ; ALIAS COPYFILE ; FLAGS DC_BORLAND Этот пример показывает использование системной функции копирования, которая находится в системной библиотеке KERNEL32.DLL
|
|
|
|
| |
Пост N: 498
Зарегистрирован: 17.05.05
|
|
Отправлено: 04.12.06 21:25. Заголовок: Re:
Andrey пишет: цитата: | И можно ли использовать DLL написанные на других языках, в частности на Delphi ? |
| gfilatov похоже тут не получится.......или я не прав ? ;)
|
|
|
|
| постоянный участник
|
Пост N: 133
Зарегистрирован: 12.09.06
|
|
Отправлено: 04.12.06 22:17. Заголовок: Re:
Как так не получиться, почему системные DLL можно использовать, а на Дельфи или С нельзя ?
|
|
|
|
| постоянный участник
|
Пост N: 134
Зарегистрирован: 12.09.06
|
|
Отправлено: 04.12.06 23:39. Заголовок: Re:
Pasha пишет: цитата: | вместо c0x32.obj надо прилинковать c0w32.obj |
| Тогда выдает следующее Error: Unresolved external 'winmain' referenced from Z:\BCC55\LIB\C0X32.OBJ Что-то меня берет сомнение в правильности теста. Поделитесь как использовать HARBOUR.DLL ? Пример PRG и скрипта для HBMAKE (у меня проект на нем).
|
|
|
|
| |
Пост N: 74
Зарегистрирован: 02.02.06
|
|
Отправлено: 05.12.06 00:57. Заголовок: Re:
Andrey пишет: цитата: | Error: Unresolved external 'winmain' referenced from Z:\BCC55\LIB\C0X32.OBJ |
| У тебя опять используется C0X32.OBJ
|
|
|
|
| Администратор
|
Пост N: 415
Зарегистрирован: 23.05.05
|
|
Отправлено: 05.12.06 11:10. Заголовок: Re:
Я hbmake не использую, но судя по всему она работает некорректно в некоторых случаях Цепляет не тот модуль иницализации. Я не разбирался в отличиях c0w32, c0d32, c0x32, во всех режимах: для интерфейса gui или tui, с dll или без использую c0w32. Может я неправ, подскажите Для использовавания harbour.dll надо кроме harbour.lib еще линковать dllmain.lib, тогда не будет ошибки с winmain Привожу свои батники для сборки в режиме tui *************** файл setdir.bat set HB_INSTALL=d:\xharbour set FWH_INSTALL=d:\fwh set BCC_DIR=d:\bcc55 rem мои либы set APP_DIR=e:\ts\app.lib set SRV_DIR=e:\ts\clip50.lib set OBJ_DIR=d:\temp\obj32 IF not "%_UI%" == "w" goto :dos IF "%_DLL%" == "" set EXE_DIR=e:\exe\win32 IF "%_DLL%" == "1" set EXE_DIR=e:\exe\win32d goto :exit :dos IF "%_DLL%" == "" set EXE_DIR=e:\exe\con32 IF "%_DLL%" == "1" set EXE_DIR=e:\exe\con32d :exit *************** файл cl.bat if "%_PR%" == "" set _DEF_= if not "%2" == "" set OBJ_FILE=%2 if "%OBJ_FILE%" == "" set OBJ_FILE=%1 if "%_DEBUG_%" == "" goto :nodebug set _DOPT_=-b goto :compl :nodebug set _DOPT_=-l :compl IF not "%_UI%" == "w" goto :dos %HB_INSTALL%\bin\harbour %PRG_DIR%\%1.prg -o%OBJ_DIR%\%OBJ_FILE%.c %_DOPT_% -n -w -d_fw -d%UMAC% -d_ver_52 %_DEF_% -i%HB_INSTALL%\include;%FWH_INSTALL%\include;%APP_DIR% >>__warn %BCC_DIR%\bin\bcc32 -c -d -O2 -tW -M -o%OBJ_DIR%\%OBJ_FILE%.obj -I%BCC_DIR%\include;%HB_INSTALL%\include;%FWH_INSTALL%\include %OBJ_DIR%\%OBJ_FILE%.c goto :exit :dos %HB_INSTALL%\bin\harbour %PRG_DIR%\%1.prg -o%OBJ_DIR%\%OBJ_FILE%.c %_DOPT_% -n -w -d%UMAC% -d_ver_52 %_DEF_% -i%HB_INSTALL%\include;%APP_DIR% >>__warn %BCC_DIR%\bin\bcc32 -c -d -O2 -tW -M -o%OBJ_DIR%\%OBJ_FILE%.obj -I%BCC_DIR%\include;%HB_INSTALL%\include %OBJ_DIR%\%OBJ_FILE%.c :exit set OBJ_FILE= *************** файл _one.bat @echo off call setdir.bat set PRG_DIR=%2 set MAIN=%1 if not "%3" == "" set EXE_NAME=%EXE_DIR%\%3.exe call cl %1 IF EXIST %MAIN%.rc brc32 -r %MAIN% echo %BCC_DIR%\lib\c0w32.obj + > b32.bc echo %OBJ_DIR%\%1.obj + >> b32.bc IF "%_UI%" == "w" call buildw.bat IF "%_UI%" == "d" call buildd.bat *************** файл buildd.bat if "%EXE_NAME%" == "" set EXE_NAME=%EXE_DIR%\%MAIN%.exe echo ,%EXE_NAME%, + >> b32.bc echo %MAIN%.map, + >> b32.bc rem echo %HB_INSTALL%\lib\bcc640.lib + >> b32.bc if "%_DLL%" == "1" goto :dll rem мои либы echo %SRV_DIR%\servhd.lib + >> b32.bc echo %APP_DIR%\apphd.lib + >> b32.bc goto :hbl :dll rem моя dll echo %HB_INSTALL%\lib\hbgals.lib + >> b32.bc rem стандартные dll echo %HB_INSTALL%\lib\harbour.lib + >> b32.bc echo %HB_INSTALL%\lib\dllmain.lib + >> b32.bc goto :end :hbl echo %HB_INSTALL%\lib\pcrepos.lib + >> b32.bc echo %HB_INSTALL%\lib\rtl.lib + >> b32.bc echo %HB_INSTALL%\lib\fmstat.lib + >> b32.bc echo %HB_INSTALL%\lib\vm.lib + >> b32.bc if "%_WVT%" == "" echo %HB_INSTALL%\lib\gtwin.lib + >> b32.bc echo %HB_INSTALL%\lib\gtwvt.lib + >> b32.bc echo %HB_INSTALL%\lib\wvtgui.lib + >> b32.bc echo %HB_INSTALL%\lib\gtnul.lib + >> b32.bc echo %HB_INSTALL%\lib\lang.lib + >> b32.bc echo %HB_INSTALL%\lib\codepage.lib + >> b32.bc echo %HB_INSTALL%\lib\macro.lib + >> b32.bc echo %HB_INSTALL%\lib\rdd.lib + >> b32.bc echo %HB_INSTALL%\lib\rddads.lib + >> b32.bc echo %HB_INSTALL%\lib\ace32.lib + >> b32.bc echo %HB_INSTALL%\lib\dbfntx.lib + >> b32.bc echo %HB_INSTALL%\lib\dbfcdx.lib + >> b32.bc echo %HB_INSTALL%\lib\dbffpt.lib + >> b32.bc echo %HB_INSTALL%\lib\hbsix.lib + >> b32.bc echo %HB_INSTALL%\lib\common.lib + >> b32.bc echo %HB_INSTALL%\lib\debug.lib + >> b32.bc echo %HB_INSTALL%\lib\pp.lib + >> b32.bc echo %HB_INSTALL%\lib\ct.lib + >> b32.bc echo %HB_INSTALL%\lib\hbzip.lib + >> b32.bc :end echo %BCC_DIR%\lib\cw32.lib + >> b32.bc echo %BCC_DIR%\lib\import32.lib, >> b32.bc if "%RESFILE%" == "" goto :dele if exist %RESFILE% echo %RESFILE% >> b32.bc :dele if exist %EXE_NAME% del %EXE_NAME% %BCC_DIR%\bin\ilink32 -Gn -Tpe -L%BCC_DIR%\lib @b32.bc rem if exist %EXE_NAME% d:\upx\upx -9 %EXE_NAME% if not exist %EXE_NAME% pause del %EXE_DIR%\*.tds rem del %MAIN%.c del %MAIN%.map rem del %MAIN%.obj del b32.bc файл buildw.bat не привожу, т.к. там специфика fw для сборки программы состоящей из одного модуля пишелся батник call _one.bat <prgname без расширения> <dirname> [exename] для сборки программы состоящей из нескольких модулей другой батник *********** _rm.bat @echo off call setdir.bat set PRG_DIR=e:\ts\rm set MAIN=rm call cl rm call cl ord call cl rep call cl mbp IF EXIST %MAIN%.rc brc32 -r %MAIN% echo %BCC_DIR%\lib\c0w32.obj + > b32.bc echo %OBJ_DIR%\rm.obj + >> b32.bc echo %OBJ_DIR%\ord.obj + >> b32.bc echo %OBJ_DIR%\rep.obj + >> b32.bc echo %OBJ_DIR%\mbp.obj + >> b32.bc IF "%_UI%" == "w" call buildw.bat IF "%_UI%" == "d" call buildd.bat Параметры сборки _UI - пользовательский интерфейс (обязательно) set _UI=d консольный интерфейс set _UI=w графический интерфейс Необязательные переменные set _DLL=1 сборка в режиме с dll set _DEBUG_=1 режим отладки Каталоги для сборки установить в setdir.bat Я закатал xHarbour и bcc55 и эти батники сборки себе на cdrw, и достаточно поправить каталоги в setdir.bat, чтобы собирать программы на любом компьютере с сидюка
|
|
|
|
| постоянный участник
|
Пост N: 136
Зарегистрирован: 12.09.06
|
|
Отправлено: 06.12.06 01:44. Заголовок: Re:
Pasha пишет: цитата: | Для использовавания harbour.dll надо кроме harbour.lib еще линковать dllmain.lib, тогда не будет ошибки с winmain |
| Частично получилось. Собирается exe-ник нормально без предупреждений. Запускаю его, даже на экран выводит, а далее по программе цикл с выводом на экран и выскакивает окно: "Ошибка приложения" Инструкция по адресу "0x004583bc" обратилась к памяти по адресу "0x00000014". Память не может быть "read". Как правильно собрать в hbmake ? (у меня несколько проектов в нем) Ниже привожу test.prg -------------------------------------------------------------- FUNCTION MAIN() LOCAL nI, nJ:=1, nY:=8, nX:=0 , cNameWin SETCOLOR("15/1") CLEAR SCREEN TEXT -------- -------- ------- -------- -- -- -- -- -- -- -- -- -- -- -------- -- -- -- -- -- -- -- -- -------- ------- -- ENDTEXT wait FOR nI := 0 TO 255 @ nJ + nY, nX SAY ALLTRIM(STR(nI))+" "+CHR(nI) COLOR("15/0") nJ++ IF nJ > 19 nJ := 1 nX := nX + LEN(ALLTRIM(STR(nI)))+3 ENDIF NEXT INKEY(0) RETURN NIL -------------------------------- Ниже test.bc #BCC VERSION=BCB.01 !ifndef CC_DIR CC_DIR = $(MAKE_DIR) !endif !ifndef HB_DIR HB_DIR = $(HARBOUR_DIR) !endif RECURSE= NO COMPRESS = NO EXTERNALLIB = YES XFWH = NO FILESTOADD = 5 WARNINGLEVEL = 0 USERDEFINE = USERINCLUDE = GUI = NO MT = NO SRC02 = obj PROJECT = test.exe $(PR) OBJFILES = $(SRC02)\TEST.obj $(OB) PRGFILES = TEST.PRG $(PS) OBJCFILES = $(OBC) CFILES = $(CF) RESFILES = RESDEPEN = TOPMODULE = TEST.PRG LIBFILES = harbour.lib dllmai.lib EXTLIBFILES = optcon.lib lang.lib vm.lib rtl.lib rdd.lib macro.lib pp.lib dbfntx.lib dbfcdx.lib dbffpt.lib common.lib gtwin.lib codepage.lib ct.lib tip.lib pcrepos.lib hsx.lib hbsix.lib DEFFILE = HARBOURFLAGS = -w0 CFLAG1 = -OS $(CFLAGS) -d -c -L$(HB_DIR)\lib CFLAG2 = -I$(HB_DIR)\include;$(CC_DIR)\include RFLAGS = LFLAGS = -L$(CC_DIR)\lib\obj;$(CC_DIR)\lib;$(HB_DIR)\lib -Gn -M -m -s -Tpe -x -ap IFLAGS = LINKER = ilink32 ALLOBJ = c0x32.obj $(OBJFILES) $(OBJCFILES) ALLRES = $(RESDEPEN) ALLLIB = $(LIBFILES) import32.lib cw32.lib .autodepend #DEPENDS #COMMANDS .cpp.obj: $(CC_DIR)\BIN\bcc32 $(CFLAG1) $(CFLAG2) -o$* $** .c.obj: $(CC_DIR)\BIN\bcc32 -I$(HB_DIR)\include $(CFLAG1) $(CFLAG2) -o$* $** .prg.obj: $(HB_DIR)\bin\harbour -D__EXPORT__ -n -go -I$(HB_DIR)\include $(HARBOURFLAGS) -o$* $** .rc.res: $(CC_DIR)\BIN\brcc32 $(RFLAGS) $< #BUILD $(PROJECT): $(CFILES) $(OBJFILES) $(RESDEPEN) $(DEFFILE) $(CC_DIR)\BIN\$(LINKER) @&&! $(LFLAGS) + $(ALLOBJ), + $(PROJECT),, + $(ALLLIB), + $(DEFFILE), + $(ALLRES) ! ---------------------------------- P.S. Залез в папку xHarbour\tests, там есть dll_b32.bat Пробовал его запускать, не собирает, выдает: MAKE Version 5.2 Copyright (c) 1987, 2000 Borland ..\bin\b32\harbour.exe -n -i..\include -w1 disptest.prg -o.\disptest.c ** error 1 ** deleting .\disptest.c
|
|
|
|
| постоянный участник
|
Пост N: 60
Зарегистрирован: 09.10.06
|
|
Отправлено: 06.12.06 15:08. Заголовок: Re:
Andrey пишет: У меня Ваш пример собрался и отработал, что с c0x32.obj, что с c0w32.obj Andrey пишет: цитата: | "Ошибка приложения" Инструкция по адресу "0x004583bc" обратилась к памяти по адресу "0x00000014". Память не может быть "read" |
| Рекомендую обновить антивирус, файревол и т.п.
|
|
|
|
| постоянный участник
|
Пост N: 61
Зарегистрирован: 09.10.06
|
|
Отправлено: 06.12.06 15:55. Заголовок: Re:
Andrey пишет: цитата: | P.S. Залез в папку xHarbour\tests, там есть dll_b32.bat Пробовал его запускать, не собирает, выдает: MAKE Version 5.2 Copyright (c) 1987, 2000 Borland ..\bin\b32\harbour.exe -n -i..\include -w1 disptest.prg -o.\disptest.c ** error 1 ** deleting .\disptest.c |
| Сколько можно наступать на грабли посмотрите в dll_b32.mak COMPILER = ..\bin\b32\harbour.exe HARBOURLIB = ..\lib\b32 сравните с ..\bin\b32\harbour.exe -n -i..\include -w1 disptest.prg -o.\disptest.c Дальше объяснять?
|
|
|
|
|
| постоянный участник
|
Пост N: 139
Зарегистрирован: 12.09.06
|
|
Отправлено: 06.12.06 20:07. Заголовок: Re:
Петр пишет: цитата: | У меня Ваш пример собрался и отработал, что с c0x32.obj, что с c0w32.obj |
| Я его собирал на xHarbour'e 0.99.60, проверял на 2х домашних компьютерах, завтра на работе проверю. Вроде вирусов у себя не наблюдаю. А вы на какой версии собирали ?
|
|
|
|
| постоянный участник
|
Пост N: 140
Зарегистрирован: 12.09.06
|
|
Отправлено: 06.12.06 21:58. Заголовок: Re:
Петр пишет: цитата: | Сколько можно наступать на грабли посмотрите в dll_b32.mak COMPILER = ..\bin\b32\harbour.exe HARBOURLIB = ..\lib\b32 |
| Понял, исправил, заработало. Собираються маленькие примеры, но не все. Тоже вылетает с ошибкой: адреса разные и то-же "типа память не может....." Думаю что-то с этой версией xHarbour'a 0.99.60 Помогите пожалуйста разобраться.
|
|
|
|
| постоянный участник
|
Пост N: 62
Зарегистрирован: 09.10.06
|
|
Отправлено: 06.12.06 22:04. Заголовок: Re:
В данном случае использовал xHarbour Compiler build 0.99.61 (SimpLex) Скачиваю с CVS - так, что в принципе нестабильная версия у меня, а не у Вас
|
|
|
|
| постоянный участник
|
Пост N: 141
Зарегистрирован: 12.09.06
|
|
Отправлено: 06.12.06 22:07. Заголовок: Re:
Петр, а можете мне кинуть вашу версию ? Мое мыло 30195@mail.ru Или киньте пожалуйста прямую ссылку.
|
|
|
|
| постоянный участник
|
Пост N: 144
Зарегистрирован: 12.09.06
|
|
Отправлено: 08.12.06 20:24. Заголовок: Re:
Собрал свой тестовый пример на xHarbour Compiler build 0.99.61, все прекрасно работает. harbour.dll имеет размер 2 160 128 байт, а harbour.dll версии 0.99.60 - 1 902 080 байт. А на xHarbour Compiler build 0.99.60 вылетает с ошибкой типа ....Память не может быть "read" Вывод надо пересобрать harbour.dll в версии 0.99.60. А как ? Есть ли внем стандартые средства пересборки harbour.dll ?
|
|
|
|
| постоянный участник
|
Пост N: 69
Зарегистрирован: 09.10.06
|
|
Отправлено: 08.12.06 23:26. Заголовок: Re:
Andrey пишет: цитата: | Вывод надо пересобрать harbour.dll в версии 0.99.60. |
| А почему бы не пользоваться xHarbour Compiler build 0.99.61, тем более, что официальная версия уже на подходе Стандартное средство пересборки harbour.dll - dll_b32.bat, но для пересборки Вам нужны будут сырцы, т.е. xharbour-0.99.60.src.zip
|
|
|
|
| постоянный участник
|
Пост N: 146
Зарегистрирован: 12.09.06
|
|
Отправлено: 10.12.06 02:37. Заголовок: Re:
В 0.99.61 почемуто нет библиотеки optcon.lib Я вообщето не знаю для чего она нужна, но свой проект в 99.61 я собрать не могу.
|
|
|
|
| |
Пост N: 506
Зарегистрирован: 17.05.05
|
|
Отправлено: 10.12.06 11:20. Заголовок: Re:
optcon убрали еще в марте.
|
|
|
|
| постоянный участник
|
Пост N: 74
Зарегистрирован: 09.10.06
|
|
Отправлено: 10.12.06 16:02. Заголовок: Re:
Andrey пишет: цитата: | В 0.99.61 почемуто нет библиотеки optcon.lib Я вообще то не знаю для чего она нужна, но свой проект в 99.61 я собрать не могу. |
| А для сборки используешь hbmake? Dima пишет: цитата: | optcon убрали еще в марте. |
| Убрали, а из исходников hbmake забыли удалить aadd(aDefLib,'optcon'+ cSuffix) aadd(aDefLib,'optconmt'+ cSuffix) aadd(aDefLib,'optgui'+ cSuffix) aadd(aDefLib,'optguimt'+ cSuffix) может еще что-то. Andrey, мне кажется пользоваться hbmake не есть good idea А если хочется - скачай исходники и возись с ним.
|
|
|
Ответов - 25
, стр:
1
2
All
[только новые]
|
|