PDA

View Full Version : بارگذاری اطلاعات تصویر از فایل dll



shahram197070
جمعه 01 تیر 1386, 18:36 عصر
با سلام
دوستان محترم یک فایل dll دارم که چند تا تصویر داخلشه حالا چطوری میشه یکی از اون تصویرها رو تصویرزمینه فرم قرار داد (نحوه خوندن اطلاعات تصویر از فایل dll برام مهمه)

shahram197070
شنبه 02 تیر 1386, 23:24 عصر
یعنی یک نفر نیست جواب ما رو بده

ghafoori
یک شنبه 03 تیر 1386, 06:45 صبح
دوست عزیز شما مشخص نکردید این عکس ها چطور در ان ذخیره شده اگر داخل resource فایل dll هستش شما یک تابعی داخل dll بگذارید تا وقتی شما نام عکس را بهش می دهید به شما عکسی تحویل دهد بعد ان تابع dll را در برنامتون فرا خوانی کنید

shahram197070
دوشنبه 04 تیر 1386, 12:47 عصر
دوست عزیز شما مشخص نکردید این عکس ها چطور در ان ذخیره شده اگر داخل resource فایل dll هستش شما یک تابعی داخل dll بگذارید تا وقتی شما نام عکس را بهش می دهید به شما عکسی تحویل دهد بعد ان تابع dll را در برنامتون فرا خوانی کنید

با سلام و تشکر به خاطر جواب
بله عکسها درون resource فایل dll قرار داره اما امکان داره که بفرمائید که چطوری میشه که تابع رو درون dll قرارداد و چطوری میشه اون را صدا زد و عکس رو از درون dll گرفت

__H2__
سه شنبه 05 تیر 1386, 10:42 صبح
با سلام و تشکر به خاطر جواب
بله عکسها درون resource فایل dll قرار داره اما امکان داره که بفرمائید که چطوری میشه که تابع رو درون dll قرارداد و چطوری میشه اون را صدا زد و عکس رو از درون dll گرفت

سلام
قسمت اول سوالتان که واقعاً جالب است!!!
dll مخصوص کپسوله کردن توابع و کلاسس هاست، آنوقت شما میپرسید..... :لبخندساده:
میتوانید یک کلاسس با کد زیر ایجاد کنید.


Public NotInheritable Class Resource

Public Shared Function GetImage(ByVal name As String) As System.Drawing.Image
'Code...
End Function

End Class


و بعد در هرجا که خواستید میتوانید با Resource.GetImage عکس را تحویل بگیرید.
ولی من هم باز ابهامی دارم که کد را کامل ننوشتم!
عکس را در داخل فایلهای منبع resource.resx ذخیره کرده اید یا خود فایل عکس را به پروژه اضافه و ان را مستقیم Embeded کرده اید؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

shahram197070
سه شنبه 05 تیر 1386, 18:26 عصر
با سلام و تشکر
این فایل dll را با vb6 ساختم یعنی توسط vb resource editor تصاویر رو درون فایل گذاشته و اونو به صورت dll کامپایل کردم .

داخل vb6 تصاویر رو با کد زیر استخراج می کردم اما حالا با .net موندم چه کار کنم





Me.Picture = LoadPictureDLL(App.Path & "\PicResources.dll", شماره تصویر)




Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(7) As Byte
End Type
Type PicBmp
Size As Long
Type As Long
hBmp As Long
hPal As Long
Reserved As Long
End Type
Public Declare Function OleCreatePictureIndirect Lib "olepro32.dll" (PicDesc As PicBmp, RefIID As GUID, ByVal fPictureOwnHandle As Long, IPic As IPicture) As Long
Public Declare Function LoadBitmap Lib "user32" Alias "LoadBitmapA" (ByVal hInstance As Long, ByVal lpBitmapID As Long) As Long
Public Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Public Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Public Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long

Public Function LoadPictureDLL(sResourceFileName As String, ByVal lResourceId As Long) As Picture
Dim hInst As Long
Dim hBmp As Long
Dim Pic As PicBmp

Dim IPic As IPicture
Dim IID_IDispatch As GUID
Dim lRC As Long


hInst = LoadLibrary(sResourceFileName)
If hInst <> 0 Then
hBmp = LoadBitmap(hInst, lResourceId)
If hBmp <> 0 Then
IID_IDispatch.Data1 = &H20400
IID_IDispatch.Data4(0) = &HC0
IID_IDispatch.Data4(7) = &H46
Pic.Size = Len(Pic)
Pic.Type = vbPicTypeBitmap
Pic.hBmp = hBmp
Pic.hPal = 0
lRC = OleCreatePictureIndirect(Pic, IID_IDispatch, 1, IPic)
If lRC = 0 Then
Set LoadPictureDLL = IPic
Set IPic = Nothing
Else
Call DeleteObject(hBmp)
End If
End If
FreeLibrary (hInst)
hInst = 0
End If
End Function

ghafoori
سه شنبه 05 تیر 1386, 21:41 عصر
دوست عزیز از همین توابع api و کدها داخل برنامه استفاده کن

shahram197070
چهارشنبه 06 تیر 1386, 07:54 صبح
با سلام و تشکر از پاسخ شما
اما خداییش برای تبدیلش مشکل دارم.
لطفا کمک کنید.

ghafoori
چهارشنبه 06 تیر 1386, 13:10 عصر
چون یک فایا dll نمونه نداشتم از خودم یک کد هایی نوشتم ببین جواب می دهد


Public Class Form1

Structure GUID
Dim Data1 As Long
Dim Data2 As Integer
Dim Data3 As Integer
Dim Data4() As Byte
End Structure
Structure PicBmp
Dim Size As Long
Dim Type As Long
Dim hBmp As Long
Dim hPal As Long
Dim Reserved As Long
End Structure


Public Declare Function OleCreatePictureIndirect Lib "olepro32.dll" (ByVal PicDesc As PicBmp, ByVal RefIID As GUID, ByVal fPictureOwnHandle As Long, ByVal IPic As IPicture) As Long
Public Declare Function LoadBitmap Lib "user32" Alias "LoadBitmapA" (ByVal hInstance As Long, ByVal lpBitmapID As Long) As Long
Public Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Public Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Public Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long

Public Function LoadPictureDLL(ByVal sResourceFileName As String, ByVal lResourceId As Long) As Picture
Dim hInst As Long
Dim hBmp As Long
Dim Pic As Bitmap

Dim IPic As PictureBox
Dim IID_IDispatch As GUID
IID_IDispatch.Data4 = New Byte(4) {}
Dim lRC As Long


hInst = LoadLibrary(sResourceFileName)
If hInst <> 0 Then
hBmp = LoadBitmap(hInst, lResourceId)
Pic = Image.FromHbitmap(hBmp)
If hBmp <> 0 Then
IID_IDispatch.Data1 = &H20400
IID_IDispatch.Data4(0) = &HC0
IID_IDispatch.Data4(7) = &H46
lRC = OleCreatePictureIndirect(Pic, IID_IDispatch, 1, IPic)
If lRC = 0 Then
LoadPictureDLL = IPic
IPic = Nothing
Else
Call DeleteObject(hBmp)
End If
End If
FreeLibrary(hInst)
hInst = 0
End If
End Function

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
PictureBox1 = LoadPictureDLL(Application.StartupPath & "\PicResources.dll", " شماره تصویر")
End Sub
End Class

__H2__
چهارشنبه 06 تیر 1386, 15:47 عصر
سلام
کاربر ghafoori (http://www.barnamenevis.org/forum/member.php?u=11725) کدهای شما برای VB.Net مشکل دارند در تبدیل از VB6 به VB8 باید نوع Long به Integer و Integer به Short تبدیل شود.

در آخر هم شاید کلاسسی به صورت داخلی برای این کار موجود باشد. که نیاز به API نداشته باشد.
پس در کل شما dll در vb6 دارید و میخواهید عکس های ان را در vb8 باز کنید؟

shahram197070
چهارشنبه 06 تیر 1386, 19:04 عصر
با تشکر ازجناب ghafoori (http://www.barnamenevis.org/forum/member.php?u=11725)
با کمال شرمندگی هر کار کردم error می ده
مثلا IPicture رو نمیشناسه و ...

ghafoori
چهارشنبه 06 تیر 1386, 21:09 عصر
کاربر __H2__ من دنبال توابع جایگزین ان بودم ولی معادل دو تا از توابع را پیدا نکردم این فایلهای dll مانند فایلهایه ini داخل دات نت پشتیبانی نمی شود و تنها راه ان هم استفاده از همان api هاست
برای توابع LoadLibrary و FreeLibrary معادل وجود ندارد یعنی برای LoadLibrary ببین چی پیش نهاد کرده این مایکروسافت


LoadLibrary Maps the specified executable module into the address space of the calling process.
Any of the following:
System.Reflection.Assembly.Load
System.Reflection.Assembly.LoadFrom
System.Reflection.Assembly.LoadWithPartialName

این ها یکمی گنگه بعد تازه فکر کنم انطوری بریم کدنویسی بیشتر باشه برای همین می گم از api ها استفاده کنند

__H2__
پنج شنبه 07 تیر 1386, 10:23 صبح
سلام و خسته نباشید.

کاربر __H2__ من دنبال توابع جایگزین ان بودم ولی معادل دو تا از توابع را پیدا نکردم این فایلهای dll مانند فایلهایه ini داخل دات نت پشتیبانی نمی شود و تنها راه ان هم استفاده از همان api هاست
برای توابع LoadLibrary و FreeLibrary معادل وجود ندارد یعنی برای LoadLibrary ببین چی پیش نهاد کرده این مایکروسافت

این ها یکمی گنگه بعد تازه فکر کنم انطوری بریم کدنویسی بیشتر باشه برای همین می گم از api ها استفاده کنند
در مورد Long در API که اطمینان دارم ولی در ان مورد کلاسس داخلی چیزی نمیدانستم و وقت هم نکردم ببینم و گفتم شاید چیزی وجود داشته باشد. :بوس:

کلاسسها و متدهایی را هم که شما گیر اورده اید، زیاد گنگ نیستند چون خودم با انها کار کرده ام و خیلی هم راحت هستند (دو تا اولی) ولی همیشه dll مورد نظر خود دات نتی بوده و بعید میدانم برای یک dll که تحت VB6 و Com است جواب دهد، البته میشود تست کرد.
حال تست API ندارم، ولی سعی میکنم اگر وقت پیدا کردم باز در ماژول های داخلی کنکاشی بکنم و یا همان دو تابع اول را روی یک dll غیر دات نتی تست کنم. :متفکر:
ولی در کل کسی نمیگوید، روش API بد است، چون بالاخره تمام مازولهای داخلی دات نت هم خود در زیر ساخت به API ها وصل میشوند.

موفق باشید.

__H2__
پنج شنبه 07 تیر 1386, 10:38 صبح
سلام مجدد!
تابع و کلاسس برای لود مستقیم از dll که پیدا نکردم ولی یک سوال کوچک از کاربر shahram197070 (http://www.barnamenevis.org/forum/member.php?u=23161) دارم!!!!!
حالا چرا عکس ها را داخل خود Dll دات نتی یا حتی خود پروژه قرار نمیدهید؟؟؟؟؟؟؟؟؟؟؟ (فکر کنم سریعتر هم بشود!!)
گرچه شاید به این بگویید پاک کردن صورت مسئله، ولی گفتم بپرسم، شاید اصلاً مشکل جای دیگری باشد و از ریشه حل شود

ghafoori
پنج شنبه 07 تیر 1386, 12:36 عصر
کلاسسها و متدهایی را هم که شما گیر اورده اید، زیاد گنگ نیستند چون خودم با انها کار کرده ام
اگر بخواهیم از این کلاسها استفاده کنیم یقینا کد ما طولانی تر خواهد شد من به دوسته مون پیشنهاد می کنم یا از dll استفاده نکنند یا از همین api ها استفاده کنند و اگر از این راه می خواهند استفاده کنند یک dll بگذارند تا ما روش کار کنیم

shahram197070
پنج شنبه 07 تیر 1386, 18:01 عصر
سلام مجدد!
تابع و کلاسس برای لود مستقیم از dll که پیدا نکردم ولی یک سوال کوچک از کاربر shahram197070 (http://www.barnamenevis.org/forum/member.php?u=23161) دارم!!!!!
حالا چرا عکس ها را داخل خود Dll دات نتی یا حتی خود پروژه قرار نمیدهید؟؟؟؟؟؟؟؟؟؟؟ (فکر کنم سریعتر هم بشود!!)
گرچه شاید به این بگویید پاک کردن صورت مسئله، ولی گفتم بپرسم، شاید اصلاً مشکل جای دیگری باشد و از ریشه حل شود


با سلام و تشکر
داخل فایل dllی که دارم حدود 100 عدد عکس به عنوان wallPaper با حجم حدود 40MB وجود داره که همون طور که قبلا هم گفتم با vb6 ساخته شده ، در vb6 با کدی که گذاشتم هر بار که برنامه اجرا می شد به صورت تصادفی یک تصویر را از درون فایل می خوند و به عنوان background فرم اصلی قرار می داد .
حالا نمی دونم چه کار کنم اضافه کردن تصاویر به یک برنامه دات نت هم حجم برنامه رو می بره بالا هم برنامه کند می شه لطفا کمک کنید

__H2__
شنبه 09 تیر 1386, 10:57 صبح
سلام

با سلام و تشکر
داخل فایل dllی که دارم حدود 100 عدد عکس به عنوان wallPaper با حجم حدود 40MB وجود داره که همون طور که قبلا هم گفتم با vb6 ساخته شده ، در vb6 با کدی که گذاشتم هر بار که برنامه اجرا می شد به صورت تصادفی یک تصویر را از درون فایل می خوند و به عنوان background فرم اصلی قرار می داد .
حالا نمی دونم چه کار کنم اضافه کردن تصاویر به یک برنامه دات نت هم حجم برنامه رو می بره بالا هم برنامه کند می شه لطفا کمک کنید

همین بود گفتم مشکل را از ریشه حل کنیم بابا جان!!!!
خوب عزیز دل بابا! هم میتونی عکس را در پوشه ای ذخیره کنی، که از نظر سرعت هم بهتر است و تاژه کاربر میتواند به دلخواه انها را کم و زیاد کنم، هم اگر نمیخواهی عکس ها مستثیم دست کاربر بیافته (که باز هم میتواند بیافتد!* اونها را داخل یک DLL دات نتی قرار بده نه VB6!!!
یا حتی راه های خیلی بهتری هم وجود دارد، میتوانید عکس را رمزگذاری شده در یک پوشه قرار دهید و برنامه بعد از انتخاب آنها را از کدشدگی در بیاورد.

ولی کاری که عموماً باعث کندی در دات نت میشود، ذخیره فایلها در داخل فایلها resx.* است.
اگر بهرحال خواستید در داخل یک DLL دات نتی این کار را انجام دهید، تصاویر را مستقیماً به پروژه تان Include کنید و به resource اصلی اضافه کنید.
در نهایت هم یک کلاسس واسط در داخل DLL درست کنید که نام را به ان بدهید و آن عکس را به EXE شما تحویل دهد. :بوس:
و...

shahram197070
شنبه 09 تیر 1386, 12:47 عصر
با سلام و تشکر
خیلی شرمنده ، می شه بفرمائید داخل vb.net 2005 چطوری dll می سازند .

__H2__
شنبه 09 تیر 1386, 14:02 عصر
سلام

با سلام و تشکر
خیلی شرمنده ، می شه بفرمائید داخل vb.net 2005 چطوری dll می سازند .
:بوس:
لطف فرمودید! :قلب:
File -> New ->Project ->Class Library

programmermp
شنبه 09 تیر 1386, 18:47 عصر
سلام

اقای H2 من نفهمیدم عکس ها توی dllدات نت باشه قابل دسترس هست یا vb6 باشه؟؟؟؟؟

با تشکر

shahram197070
شنبه 09 تیر 1386, 18:48 عصر
با سلام
بیشتر می شه توضیح بدید برای اشکال بالا چه کار باید بکنم (چه کدی باید نوشت تا به تصاویر داخل Resource دست پیدا کرد)

shahram197070
یک شنبه 10 تیر 1386, 07:35 صبح
سلام

با تشکر از __H2__ و ghafoori (http://www.barnamenevis.org/forum/member.php?u=11725) محترم ، مشکل حل شد .

__H2__
یک شنبه 10 تیر 1386, 10:25 صبح
سلام
آقا شرمنده اخلاق ورزشی! بابا یک پست هم میزدید میدیدم! چرا حالا میزنی! :قلب:
چه عکس درون Dll ساخته شده با VB6 باشد و چه در VB8 هر دو قابل استفاده است ولی اگر عکس ها داخل یک DLL ساخته شده با VB8 باشد و برنامه هم با VB8 نوشته شده باشد، واضح است که با هم مچ تر هستند و حجم کد نویسی کم میشود و اطمینان به کدها به شد بالا میرود.

بابا جهنم ضرر! سعی میکنم، یک نمونه کوچک، (خیلی خیلی کوچک) شامل یک dll و exe تحت VB8 درست کنم که exe از تصاویر داخل dll استفاده کند، اما کمی طول میکشد تا وقت خالی پیدا کنم، فعلاً شما ایمیل لطف کنید!!!!!!

shahram197070
یک شنبه 10 تیر 1386, 12:44 عصر
با سلام
آقا جدی میگم با راهنمایی شما دوستان نهایتا موفق به خوندن اطلاعات از درون فایل dll دات نت شدم .
:تشویق: بازم تشکر می کنم (سپاس)

programmermp
یک شنبه 10 تیر 1386, 19:22 عصر
سلام
آقا شرمنده اخلاق ورزشی! بابا یک پست هم میزدید میدیدم! چرا حالا میزنی! :قلب:
چه عکس درون Dll ساخته شده با VB6 باشد و چه در VB8 هر دو قابل استفاده است ولی اگر عکس ها داخل یک DLL ساخته شده با VB8 باشد و برنامه هم با VB8 نوشته شده باشد، واضح است که با هم مچ تر هستند و حجم کد نویسی کم میشود و اطمینان به کدها به شد بالا میرود.

بابا جهنم ضرر! سعی میکنم، یک نمونه کوچک، (خیلی خیلی کوچک) شامل یک dll و exe تحت VB8 درست کنم که exe از تصاویر داخل dll استفاده کند، اما کمی طول میکشد تا وقت خالی پیدا کنم، فعلاً شما ایمیل لطف کنید!!!!!!

سلام

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

بگیریم ممنون میشم بزارید

با تشکر فراوان ایمیل من که هست در امضایم ولی باز هم چشم

salehi_programmer@yahoo.com

__H2__
دوشنبه 11 تیر 1386, 10:15 صبح
سلام
چون در تاپیک دیگری هم الاف همین Resource بودم و گفتم شاید بعداً هم به کار آید آپلودش کردم.

البته خیلی خیلی ساده است.
مثلاً لیستی از فایلها دارد، که الآن ثابت برگشت داده میشود ولی میتوان به صورت runtime لیست کلیه فایلهای داخل شده را به دست آورد و برگرداند که دیگر با اضافه و کم کردن عکس های درون dll نیازی به تغییر کدها ندارید و یا استفاده از enum و چند چیز دیگر که هم برای سادگی و کم وقت کم خودم انها را لحاظ نکردم، مهم سرنخ است!!!!
http://www.h02.ir/download.aspx?File=Exe-Dll-Resources.vb.zip