View Full Version : سوال: قرار دادن يك فايل در فايل exe برنامه و استفاده از آن
timeteam
پنج شنبه 13 تیر 1387, 00:21 صبح
سلام خدمت همه اساتيد فروم .
سوال بنده : چطوري يك سري فايل در درون فايل EXE قرار دهيم و از آن استفاده كنيم مثال : وقتي كرك (از نوع پچ ) برنامه اي را ميگيري و در فلدر برنامه كپي ميكني يك فايل exe اما يك يا چند فايل در مسير مورد نظر كپي ميشود .
ممنون از دوستان اگر راهنمايي كنند و يا مثالي بگذارند.
__H2__
پنج شنبه 13 تیر 1387, 02:07 صبح
سلام
اصولاً کار جالبی نست.
1- با فرمان Project->Add Existing Item فایل را به پروژه الحاق کنید
2- فایل را از Solution Explorer انتخاب و در پنجره properties خصوصیت Build Action انرا به Embedded Resource ست کنید.
3- استریم فایل با فرمان زیر در دسترس است،
System.Reflection.Assembly.GetExecutingAssembly.Ge tManifestResourceStream("Projectname.Filename.exe")
timeteam
جمعه 14 تیر 1387, 00:16 صبح
خيلي ممنون اما ميتونيد يك مثال بگذاريد
__H2__
جمعه 14 تیر 1387, 00:52 صبح
سلام
کد به اینکه فایل چه فرمتی دارد و چه استفاده ای از آن میشود، فرق میکند.
مثلاً برای تصاویر و متون و html و صوت و... راه های ساده ای برای استفاده وجود دارد.
ولی شما نوع فایل را مشخص نکردید...
من فقط میتوانم کد کلی زیر را برایتان بگذارم
پس از طی کردن مراحل 1 و 2 در پست قبلیم، با کد زیر میتوانید فایل Embedded شده را با هر حجمی که باشد در مسیر واقعی هارد Extract کنید.
البته راه میانبر دیگری هم دارد ولی راه فوق مطمئن و قطعی است.
Public Shared Sub Copy(ByVal Source_EmbeddedName As String, ByVal Destin_FilePath As String)
Const BUFFERSIZE As Integer = 16 * 1024
Dim buffer(BUFFERSIZE - 1) As Byte
Dim iRead As Integer
Using _
source As System.IO.Stream = System.Reflection.Assembly.GetExecutingAssembly.Ge tManifestResourceStream(Source_EmbeddedName), _
destin As New System.IO.FileStream(Destin_FilePath, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Write)
Do
iRead = source.Read(buffer, 0, BUFFERSIZE)
If (iRead <= 0) Then Return
destin.Write(buffer, 0, iRead)
Loop
End Using
End Sub
با این کد هم قابل فراخوانی و استفاده است
Copy("Projectname.Filename.Extension", "C:\Filename.Extension")
موفق باشید.
e601
جمعه 14 تیر 1387, 10:53 صبح
با سلام
حالا اگه بخواهیم که یه فایل مثلا صوتی رو توی فایل exe خودمون داشته باشیم باید همون مراحل 1 و 2 رو طی بکنیم؟
و اگه اضافه کردیم باید چطوری ازش استفاده بکنیم؟؟؟؟
با تشکر...
__H2__
جمعه 14 تیر 1387, 13:09 عصر
سلام
اگر فایلتان فرمت wav داشته باشد یا با نرم افزاری به wav تبدیلش کنید، میتوانید از کد زیر استفاده کنید.
Dim player As New System.Media.SoundPlayer(System.Reflection.Assembl y.GetExecutingAssembly.GetManifestResourceStream("Projectname.Filename.wav"))
player.Play()
'player.PlayLooping()
'player.PlaySync()
'player.Stop()
مفهوم کلی همان است که در پست 2 گفتم، دستور پست 2 به شما یک Stream از فایل مورد نظر پس میدهد، شما میتوانید این Stream را برای دستورات مختلف و کاربرد های متفاوت خرج کنید.
اغلب کلاسهای دات نت که مربوط به کار روی فایلهایی خاص کار میکنند، بجز پذیرفتن مسیر فایل در هارد، Stream ای به فایل را هم میپذیرند که این قابلیت بزرگی است، یک Stream مثل همین مورد میتواند یک فایل Embedded شده را نشانه رفته باشد، یا یک Stream دانلود باشد، یا یک Stream شبکه، و....
این از ویزگی های وراثت است.
e601
جمعه 14 تیر 1387, 13:51 عصر
ممنون از پاسختون
البته منظور اصلی من اینه که فایل صوتی داخل فایل exe خودمون کامپایل بشه و اصلا در هارد قرار نگیره. مثل بعضی از فایلهای Pacth یا KeyGen که وقتی اجرا میشن یه فایل موزیک رو پخش میکنن...
__H2__
جمعه 14 تیر 1387, 16:00 عصر
سلام
خوب کد فوق همین کار را انجام میدهد... !
یعنی لزومی به وجود فایل صوتی در خارج exe نخواهد بود
معنی Embedded همین است.
شما فایل را Embedded میکنید و قادر خواهید بود با همان دو خط کد و بدون خارج کردن در هارد، فایل صوتی را پخش کنید.
timeteam
یک شنبه 16 تیر 1387, 23:57 عصر
خيلي ممنون اما من اجرا كردم يه فايل psd تو برنامه قرار دادم اما تو اين دستور خطا ميگرفت
iRead = source.Read(buffer, 0, BUFFERSIZE)
بعد اگه برای تصاویر و متون و html و صوت هم توضيح بدي ممنون ميشم و سوال بعدي هم اين كه اگه
project >properties رو انتخاب كني و در قسمت كناري اون تب resources رو انتخاب كني اونجا ميتوني فايل قرار بدي و يه فلدر با همين نام به پروژت اضافه ميشه اي هم چطوريه؟
من براي آهنگ باهاش كار كردم
__H2__
یک شنبه 23 تیر 1387, 02:33 صبح
سلام
اول از دوستان عضر خواهی میکنم، مجبور شدم یک هفته ای به مسافرتی کوتاه برم، و تازه امروز برگشتم...
در کل مجدداً بابت تاخیر در ارسال جواب عضر خواهی میکنم.
...تو اين دستور خطا ميگرفت..
چه خطایی؟ حتماً NullRefrence ???!!!
یا مراحل را درست انجام نداده اید یا Projectname.Filename.Extension را صحیح وارد نکرده اید...
Project->Properties را اجرا و به کادر AssemblyName دقت کنید.
... برای تصاویر و متون و html و صوت
صوت را که در پست قبلیم گفتم
اگر فایل متنی یا html باشد میتوانید با کد زیر استخراجش کنید و در یک نمونه String لودش کنید، و اگر html باشد میتوانید برای نمایش به کنترلر WebBrowse تحویلش دهید.
به encoding هم دقت کنید.
Dim data As String
Using _
strm As System.IO.Stream = System.Reflection.Assembly.GetExecutingAssembly.Ge tManifestResourceStream("Projectname.Filename.Extension"), _
txtreader As New System.IO.StreamReader(strm, System.Text.Encoding.UTF8)
data = txtreader.ReadToEnd
End Using
اگر هم تصویر استانداری باشد bmp, gif, png, tif, wmf, jpg, ... (فرمت های پیچیده ای مثل psd به ذات در دات نت تعریف نشده اند)
Dim img As System.Drawing.Image
Using strm As System.IO.Stream = System.Reflection.Assembly.GetExecutingAssembly.Ge tManifestResourceStream("Projectname.Filename.Extension")
img = System.Drawing.Image.FromStream(strm)
End Using
Me.PictureBoxName.Image = img
project >properties رو انتخاب كني و در قسمت كناري اون تب resources رو انتخاب كني اونجا ميتوني فايل قرار بدي و يه فلدر با همين نام به پروژت اضافه ميشه اي هم چطوريه؟
اون هم بد نیست،
البته در نسخه های قبل پیش فرض در این روشی که شما گفتید XML بود، یعنی فایل باینری را به فرمت XML-Base64 تبدیل میکرد که این روش هم حجم را سنگین میکرد و هم سرعت را بشدت کاهش میداد که خوشبختانه مایکروسافت در نسخه بعدی ( یادم نیست 2005 یا 2008) پیش فرض را روی Link گذاشت.
در این روش فایل مورد نظر از طریق خواص
My.Resources.FileName
یا
My.Resources.Resources.FileName
و به صورت غیر Stream در دسترس هستند، یعنی حجم کد نویسی شما را کاهش میدهند.
مثلاً کد قبلی که نمونه ای از Image را به دست می اورد در این روش نیازی نیست، چون خود خصوصیت نمونه ای از Image را پس میدهد.
این روش یک مزیت در مورد تصاویر هم دارد.
و آن این است که اگر تصاویر را به این بخش اضافه کنید، میتوانید در زمان طراحی و به راحتی از تصاویر برای نمایش داده شدن در انواع بخش ها استفاده کنید، Menu یا PictureBox و....
مثلاً شاید شما تصویری را بخواهید در بخش های پنجره های مختلفی نشان دهیدف در دیالوگ مربوطه اگر تصویر را به بخش Local resource هر پنجره اضافه کنید، فایل مورد نظر مدام و به تعداد نقاط مورد استفاده در محصول نهایی کپی میشود و موجب افزایش حجم فایل نهایی میشود، ولی اگر آنرا در بخش Project resource file اضافه کنید و یا از مسیر Project->Properties->Resources و یا یک روش دیگر اقدام کنید، فقط یک بار فایل به درون exe یا dll نهایی وارد میشود.
از این مزیت زمان طراحی تصاویر که بگذریم، روشی که شما گفتید و ان که من پیشنهاد (من به شخصه از Sream ها خوشم می آید، دست آدم را باز میگذارند!) کردم در ذات تفاوتی ندارند و هر دو بر یک مبنا استوار هستند.
موفق باشید.
rezapassword
یک شنبه 23 تیر 1387, 15:25 عصر
دوست من به نظرم بهتره فایل رو در کنار برنامه داشته باشی
timeteam
یک شنبه 23 تیر 1387, 16:17 عصر
حالا يه اسكين داروم كه مي خوام تو برنامه قرار بدم و براي اجراي اسكين در برنامه بايد يه مسير رشته اي به آن بديم به اين صورت "skin1.Load="c:\vista.skn" حالا من مي خوام تو برنامه اسكين رو قرار بدم و استفاده كنم چطوري ميشه؟
timeteam
یک شنبه 23 تیر 1387, 17:24 عصر
حال من تمام مراحل را انجام دادم اما باز خطا ميگيره اين هم سورس مشكل كجاست؟
__H2__
دوشنبه 24 تیر 1387, 01:25 صبح
سلام
دوست من به نظرم بهتره فایل رو در کنار برنامه داشته باشی
به نظر شخصی من هم اگر تصویر یا افکت خاص صوتی یا چیزهای ثابتی از این دست باشد و در داخل اسمبلی مان بگنجانیم خوب است.
ولی جا دادن یک آهنگ یا یک exe یا dll یا امثالهم چندان زیبا و اصولی نیست و بهتر است در خارج و در کنار برنامه اصلی قرار گیرد.
حال من تمام مراحل را انجام دادم اما باز خطا ميگيره اين هم سورس مشكل كجاست؟
نام root تایپی شما شامل فاصله است و اصلاً این امکان ندارد، نام root شما Embedded_Resource است که در کل با نام فایل، میشود Embedded_Resource.id.nfo
hamidr_14
سه شنبه 08 شهریور 1390, 12:34 عصر
بسمه تعالی
با عرض سلام و خسته نباشید خدمت دوستان گرامی
با اینکه می دونم خیلی وقته از تاریخ ایجاد این تاپیک می گذره ولی مجبورم سوالم را مطرح کنم و امیدوارم دوستان راهنمایی کنند، و اما مشکل: من برنامه ای دارم که توسط چینی ها نوشته شده که شامل یک فایل exe به اضافه یکسری فولدر که در آن عکس و dllها و مابقی احتیاجات پروژه است، حال من می خوام با دات نت (ترجیحآ vb) برنامه ای بنویسم که برنامه مذکور با تمام متعلقاتش درون فایل exe برنامه من قرار بگیرد و ابتدا برنامه من اجرا شده و پس از چک کردن یکسری موارد نظیر مثلا شماره سریال cpu یا هارد یا مادربرد برنامه مذکور اجرا شود البته مشکل من فقط در همان بخش اول کار است یعنی قرار دادن برنامه ای که گفتم درون برنامه خودم، این رو هم بگم که هدفم از این کار به نوعی تولید یک قفل برای برنامه هست و البته قبل از اینکه به فکر این کار بیفتم از برنامه هایی نظیر SoftwarePassport Armadillo Professional یا Private.exe.Protector استفاده کردم امام نتیجه مطلوب و دلخواهم کسب نشد، ممنون می شم اگر کسی از دوستان در این زمینه بنده را راهنمایی کنه.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.