PDA

View Full Version : کمک برای استفاده از Dll , BPL



Touska
جمعه 06 آذر 1383, 20:53 عصر
آقا برای استفاده از Dll یا BPL بلدم چکار کنم ولی برای دسترسی از Application به Dll نمی دونم از ShareMem استفاده کنم یا روش بهتری هم وجود داره مثلا برای دسترسی
به یک Edit که در یک فرم داخل Dlll وجود داره باید چکار کرد.

:گیج:

مهدی کرامتی
شنبه 07 آذر 1383, 02:52 صبح
ShareMem زمانی بکار میرود که قرار باشد پارامتری از نوع String به Dll پاس شود یا برگردانده شود.

یکی از فصلهای آخر کتاب Mastering Delphi راه حل پرسش شما را کامل توضیح داده است.

vcldeveloper
شنبه 07 آذر 1383, 02:56 صبح
درباره استفاده از ShareMem همون موقع که DLL Wizard رو در دلفی انتخاب می کنید تا یه DLL بسازید بهتون توضیح داده میشه:


{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }


یعنی:
1- ShareMem باید در اول بخش uses پروژه DLL و پروژه ای که از اون DLL استفاده می کنه قرار بگیره.
2- در صورت استفاده از ShareMem باید با برنامه اتون فایل Borlandmm.dll رو هم اراپه کنید.
3- اگر نمیخواید از Borlandmm.dll استفاده کنید باید رشته ها را با استفاده از shortstring و PChar عبور بدید.
4- ShareMem فقط موقعی بدرد میخوره که بخوایید dll رو بین برنامه های دلفی و ++BC به اشتراک بزارید برای زبانهای دیگه باید از همون روش ذکر شده در شماره 3 استفاده کنید.

موفق باشید.

Touska
شنبه 07 آذر 1383, 21:28 عصر
اینهایی که شما گفتید درست اما اگر بخواهیم مثلا به یک RadioGroup Box یک آیتم اضافه کنیم که در داخل APP ماست و این کار را بخواهیم با استفاده از DLL انجام بدیم چکار باید کرد کسی مثال جالبی برای این کار دارد

با تشکر :گیج:

Touska
شنبه 07 آذر 1383, 21:33 عصر
منظور من برای دسترسی مستقیم از DLL به APP و برعکس

مهدی کرامتی
شنبه 07 آذر 1383, 23:27 عصر
دسترسی مستقیم از طریق DLL ممکن نیست، اما از طریق کلاسهای درون BPL که هنگام لود شدن در برنامه شما در دسترس برنامه قرار میگیرند ممکن است (البته با کمی خرده کاری های فنی).

Touska
شنبه 07 آذر 1383, 23:37 عصر
اگر ممکن است به همان روش خودتان آموزش دهید

ممنون با BPL

:flower:

مهدی کرامتی
دوشنبه 09 آذر 1383, 04:17 صبح
امیدوارم انگلیسی ات به اندازه کافی خوب باشه:
Packages offer a structural library approach to developing applications and offers a precondition for package diagrams. In Delphi/Kylix a Package is a combination, collection of units, which have dependencies.

The goal is to provide some notions about runtime packages and why use packages at all in a "designed" project?
Runtime packages, which are optional in a project, offer several advantages over a conventional programming. By compiling reused and modular code into a runtime library, we can share it among Delphi/Kylix applications.
Package diagrams are used to describe parts of a system at a high level, such as 'report generator' or 'single sign on ckecker'. These will have internal structure, and many tools will allow you to jump from the package to a detailed view of its structure.
Remember: Packages could be nested.
Two types can be made by Delphi/Kylix:
- design time packages used to install components in the IDE and to
create special property editors, experts etc. for custom
components this type is used only by IDE and is never distributed
with your app
- run time packages provide functionality when we run an application
they operate much like DLL's

Rule: Design time packages need run time packages to work but not the other way round. In this article we deal with run timers.

First Decision
--------------------
Packages allow also a faster compilation cause only code concerning the "small" application is compiled with each build. In comparison with a DLL, packages provide an easier approach with forms or method calls cause packages are owner of the application so they interact better with other classes. On the other side a DLL is more "other language friendly" and less IDE dependent.
Advantages of Packages:
- packages are specific to Delphi
- packages are UML conform
- faster compilation, less parsing
- packages save memory for many applications
- testing becomes more plannable (DUnit)
- better installation, setup's and deployment possible
- scalable in product, e.g. a light- or professional version

The first decision we should make is:
Do we put components in a package or
do we modularize a whole application with a lot of forms, data-modules, multi-language or ressources?
That means dependencies between classes should be stronger (inner coupling) than dependencies between packages.
Imagine a scheduling system for public transports with an optional messaging system or an optional reporting system. Some installation need only the schedSystem and others will install the ME and REP modul too.

Build the Package
-----------------------
Ok., let's start with a simple application with two forms (form1 and form2), form2 should become a package, means we modularize the app within a reusable module.

1. Remove Form2 from the auto-created form list
2. The Event-Handler goes like this:
with TForm2.Create(application) do begin
try
showModal;
finally
free;
end;
3. Add Unit2 to Unit1 uses (implementation part)
4. Now we create a package with Form2...
5. View/Project Manager then right click on Project Group and select
" Add New Project..." till the Package Editor arrives
6. We select Package from the New list
7. We select the "Contains" item and add Unit2.pas
8. It's time now to save and compile our package
9. Since our package is run-time only clicking on the Install
buttton will not work

The package is complete and we call it picinPac so the file generated is picinPac.bpl in the project order. Hint: If we rename the extension from bpl to dll and take a look with quickview, you can see the package like a DLL! We also define in the package editor/options the package as "Runtime only" so the property editors are wiped out (we don't need them at runtime).

Second part is now to compile the app with our package:
1. We select Project Options/ Packages tab
2. Activate the checkbox "Build with runtime packages"
3. Add in the edit box below our package like vcl50;picinPac
4. Packages listed in the edit box are automatically linked to your app's
5. Recompile it

After we compiled it, the app is about 17k but we need on a second machine the package and vcl50.bpl too, as we can see in the package editor "Requires". (But with multiple packages we need another check). The whole check for deployment is found within the compile-info from the Delphi Menu "Information and finally Package used".
The mechanic get's Delphi by statically linking our package at compile time. Note: Like a DLL, also a package is able to load dynamically with LOADPACKAGE() and UnLOADPACKAGE().
But either you choose static or dynamic, any changes in Form2 needs a rebuild within the package-editor (compile) after then Form1 is up to date. I can't say how many times we forget that. To prevent this add the package to the Project Manager Group so we can switch between compilations.

Versioning Problem
------------------------
When we update a DLL (change function's implementation), we simply compile it, export some new routines and ship the new version. All the applications using this DLL will still work (unless, of course, you've removed existing exported routines).
On the other hand, when updating a package, you cannot ship a new version of your package without also updating the executable. This is why we cannot use a unit compiled in Delphi 4 in a Delphi 5 project unless we have the unit's source; the compiler checks version information of DCU's and decides whether an unit has to be recompiled so any package that you provide for your application must be compiled using the same Delphi version used to compile the application.
Note: You cannot provide a package written in Delphi 6 to be used by an application written in Delphi 5.

Note: although the app is linked to run-time packages, the program's units must list all the units they require in the uses clause. Compiling with run time packages only tells the app where to find it's component code.


Last check is the project-source *.bpg, sort of a editable make script, that shows our packages in a "well documented" way.
Create project groups to handle related projects at once. In our example, you can create a project group that contains multiple executable or binary files such as two .BPL and an .EXE:


#------------------------------------------------------------------------------
VERSION = BWS.01
#------------------------------------------------------------------------------
!ifndef ROOT
ROOT = $(MAKEDIR)\..
!endif
#------------------------------------------------------------------------------
MAKE = $(ROOT)\bin\make.exe -$(MAKEFLAGS) -f$**
DCC = $(ROOT)\bin\dcc32.exe $**
BRCC = $(ROOT)\bin\brcc32.exe $**
#------------------------------------------------------------------------------
PROJECTS = p_lcd.exe adopac.bpl picinPac.bpl
#------------------------------------------------------------------------------
default: $(PROJECTS)
#------------------------------------------------------------------------------

p_lcd.exe: ..\p_lcd.dpr
$(DCC)
adopac.bpl: adopac.dpk
$(DCC)
picinPac.bpl: picinPac.dpk
$(DCC)موفق باشید.

Touska
دوشنبه 09 آذر 1383, 17:05 عصر
خیلی ممنون و تشکر زیاد

Touska
سه شنبه 10 آذر 1383, 21:00 عصر
اقا این که مثالی که اینجاست بدرد یک Bpl با یک App می باشد وقتی که دو تا bPL بشند نمی شود کاری کرد

یک مثال در Mastring Delphi 6 دیدم که مربوط به کار با انتخاب رنگ پس زمینه یک فرم بود که من زیاد از آن نفهمیدم

مثلا از Guid استفاده کرده بود

کمی بیشتر توضیح دهید

راستی کسی ترجمه Cahpter 10 11 12 Mastring Delphi 7 را داره

با تشکر
:موفق:

مهدی کرامتی
سه شنبه 10 آذر 1383, 23:54 عصر
در بازار میتونی پیدا کنی. البته اسمش رو عوض کرده اند.

Touska
چهارشنبه 11 آذر 1383, 21:25 عصر
خوب قربون همتون و اما

من را برای دسترسی یک App به چند Bpl بر عکس کمک کنید آن مثالی را که دادید فقط برای یک Bpl و یک App می باشد

تشکر

:flower:

Touska
پنج شنبه 12 آذر 1383, 16:07 عصر
خبری نشد

:sunglass:

مهدی کرامتی
پنج شنبه 12 آذر 1383, 21:20 عصر
برادر،
انتظار نداشته باش که دیگران بیان و برنامه شما رو براتون بنویسند.

بخصوص اینکه وقت کسانی که ممکنه بتوانند اینکار را انجام دهند قطعا محدودتر از اینه که اگر بخواهند هم بتوانند این کار را برای شما انجام دهند.

یک نقطه شروع خوب میتونه جستجو در Newsgroup های بورلند باشه، بشرط اینکه زبان انگلیسی ات به اندازه کافی خوب باشه:

http://groups.google.com/groups?hl=en&lr=&group=borland.public.delphi

بیشتر تلاش کنید تا موفق باشید :wise2:

hps
جمعه 13 آذر 1383, 16:49 عصر
سلام

بر خلاف نظر آقاى DelphiAssitant این امکان وجود داره که از توى یک DLL به اجزاى یک Form یا کلا هر متغیر دیگه‌اى در Application دسترسى پیدا کرد. براى این کار چندین راه وجود داره، من ساده‌ترین راه رو کمى توضیح مى‌دم.

هر Object در Delphi یک Pointer داره و شما وقتى از یه Object استفاده مى‌کنید در واقع با اشاره‌گر اون کار مى‌کنید بدون اینکه لازم باشه از توابع و عمل‌گرهاى خاص استفاده کنید (چیزهایى که در Pascal لازم بودن). با در اختیار داشتن اشاره‌گر و البته Class (نوعى که اشاره‌گر به اون اشاره مى‌کنه مثلا TEdit) مى‌تونید با تبدیل نوع اشاره‌گر (Type Casting)، مثل حالت عادى با اون Object کار کنید. یکى از مشکلات این روش همینجا به وجود مى‌یاد و اون هم اینه که این تبدیل نوع امن (Type Safe) نیست و ممکنه در مواقعى باعث بروز خطا بشه. بنابراین باید خود برنامه‌نویس Code رو کنترل کنه و از صحت اون اطمینان حاصل کنه.

براى این که اشاره‌گر Objectیى که در Application قرار داره رو در اختیار DLL بگذارید باید یه تابع Register داشته باشید. به خاطر داشته باشید که این DLL نباید تغییرى توى اشاره‌گر (منظورم خود اشاره‌گره نه Object) اعمال کنه و همینطور نباید نمونه‌اى از اون رو نگهدارى کنه، چون اساسا این اشاره‌گر متعلق به Application و هر نوع تغییر یا انهدام اون (براى آزاد کردن حافظه) منحصرا باید در اختیار Application باشه.

این روش اگرچه ساده‌ست اما محدودیت‌هاى زیادى داره که فقط براى کارهاى کوچیک مناسبه. روش دیگه‌اى که وجود داره Callbackها هستن که کمى پیچیده‌ترند و مفصل‌تر.

من سعى کردم ایده کلى رو مطرح کنم و خیلى وارد جزئیات نشدم.


موفق باشید
حسین

Touska
جمعه 13 آذر 1383, 19:04 عصر
خیلی ممنون و تشکر اگر بتوانید با مثال باشد خیلی بهتره

ممنون
:flower:

مهدی کرامتی
جمعه 13 آذر 1383, 19:15 عصر
دوست عزیز hps:

به جمع برنامه نویسان دلفی این سایت خوش آمدید.

خوب است خودتان یکبار این ایده را عملی تست کنید و اگر نتیجه گرفتید آنرا همراه با مثال عملی اینجا برای ما بنویسید.

Touska
شنبه 14 آذر 1383, 08:16 صبح
ممنون می شیم :موفق:

hps
شنبه 14 آذر 1383, 14:00 عصر
سلام

آقاى DelphiAssistant البته توصیه شما خوب، متین و به جاست، اما بنده حداقل در حوزه مسائل فنى عادت ندارم حرفى رو همینطورى بزنم و از صحت اغلب اونها به واسطه مطالعه یا تجربه اطمینان دارم.

ایده اصلى رو پیش‌تر توضیح دادم و نوشتن برنامه‌اى براى آزمایش اون (که فکر نمى‌کنم مجموعاً بیش از صد خط بشه) کار پیچیده‌اى نیست. اگر دوستان براى نوشتن این برنامه مشکل دارند، سعى مى‌کنم تا آخر هفته علیرغم محدودیت زمانى‌ام، وقتى رو براى تهیه برنامه نمونه اختصاص بدم و اون رو در اختیار شما قرار بدم تا هم مفید واقع بشه و هم وسیله‌اى بشه براى اثبات صدق گفتار ما :)

موفق باشید
حسین

hps
یک شنبه 15 آذر 1383, 20:18 عصر
سلام

این هم نمونه ...

مهدی کرامتی
دوشنبه 16 آذر 1383, 00:26 صبح
سلام.

روش جالبی است، اما همونطور که خودتون گفتید برای کارهای کوچک کاربرد دارد و در برای استفاده در برنامه هایی که از یک حد کوچک بزرگتر هستند مناسب نیست. در این گونه موارد پیچیدگی بیشتری مورد نیاز است.

hps
دوشنبه 16 آذر 1383, 10:08 صبح
سلام


بله مخصوصا این که Thread-Safe نیست و باید موقع پیاده‌سازى اون توى برنامه‌هاى Multi Thread دقت زیادى بشه.


خدانگهدار
حسین