# Native Code > برنامه نویسی با C > برنامه نویسی با MFC و ++Visual C >  منتشر کردن برنامه های Visual stdio 2005

## A_Salimi

با سلام :

پس از اینکه برنامه های حاصل از mfc رو در ویژوال استدیو رو بخواهیم در کامپیوترهای دیگه هم منتشر کنیم دقیقا به چه چیزایی نیاز داریم ؟ اول بگید این سه dll کافیه ؟
MFC42.dll 
 MFCD42.dll  
 MSVCRT.dll

ضمنا dll ها و Activex ها رو در کامییوتر میزبان (target computer) چطور رجیستر کنم ؟ (بدون استفاده از regsvr32) .

و سه تا سوال دیگه ؟

فایلهایی رو که برنامه به اونها نیاز داره رو چطور آدرس دهی کنم ؟ یعنی در حقیقت میخوام این رو بدونم :
فرض کنیم چند تا فایل صوتی هستش که یک اکتیوایکس مثل mci32 قراره در برنامه  اونها رو در صورت لزوم پخش کنه . . . آدرس فایلها رو در کامپیوتر میزبان چطور برای اکتیوایکسم مشخص کنم ؟

یکی از دوستانم میگفت که در کامپیوتر میزبان اگه در path سیستم فایلهای خودمون رو کپی کنیم مشکلی در آدرس دهی نخواهیم داشت (و همچنین استفاده از Environment Variables در قسمت Advanced در My computer ) . خوب . . . یک فایل نصبی چطور این مسیر رو پیدا میکنه ؟

در مورد static linking هم چیزایی شنیدم . آیا این روش رو توصیه میکنید ؟

و در آخر اینکه :
Bitmap ها و آیکنها هم نیاز به آدرس دهی دارند ؟ خوب فایل exe ما یه جورایی باینری شده . . . میخواستم بدونم آیا نیاز به آدرس دهی مجدد دارند ؟

با تشکر

----------


## Nima_NF

اگر از برنامه های نصب استفاده می کنید، کل فایلهای msm برای CRT و MFC را به برنامه اضافه کنید، برای کپی دستی بستگی به نسخه کامپایلر و امکاناتی که از آن ها استفاده کرده اید دارد، برای اطلاعات بیشتر در مورد dll های قابل انتشار به فایل Redist.txt در فولدر Visual Studio بروید و آن ها را مشاهده کنید.

برای dll ها اکثرا کپی کردن آن ها در فولدر برنامه یا شاخه system32 کفایت می کند و کار خواصی نیاز نیست، اما برای سایر موارد و ActiveX هایی که نیاز به رجیستر شدن دارند از همان regsvr32.exe با استفاده از دستور ( )system در C برای اجرای command استفاده کنید.

برای Environment Variables و PATH می توانید از رجیستری و یا اجرای دستورات command به شکل قبل استفاده کنید، صفحه زیر را مشاهده کنید:
http://vlaurie.com/computers2/Articles/environment.htm




> Bitmap ها و آیکنها هم نیاز به آدرس دهی دارند ؟


کلا فایل هایی که به عنوان resource به برنامه اضافه شده اند در داخل فایل exe شما قرار می گیرند و نیاز به مسیر دهی ندارند، اما در سایر موارد چه فیلم ، چه عکس و هر فایل دیگری که در داخل کدها به آن ها مسیر داده اید باید در مسیر مشخص و ثابتی کپی شوند، مثلا در فولدری در کنار فایل اجرایی شما:

"..\\images\\pic1.bmp"

----------


## A_Salimi

> اگر از برنامه های نصب استفاده می کنید، کل فایلهای msm برای CRT و MFC را به برنامه اضافه کنید


من قصد دارم از امکانات خود visual stdio بهره ببرم یعنی در حقیقت میخواهم از setup and deployment در خود ویژوال استدیو استفاده کنم .
فایلهای msm ؟ منظورتون دقیقا چیه ؟




> برای اطلاعات بیشتر در مورد dll های قابل انتشار به فایل Redist.txt در فولدر Visual Studio بروید و آن ها را مشاهده کنید.


این کار رو کردم .و اینها رو دیدم :

 
msjet35.dll
msjint35.dll
msjter35.dll
msrd2x35.dll
msrepl35.dll
expsrv.dll
vbajet32.dll
msexch35.dll
msexcl35.dll
mspdox35.dll
msltus35.dll
mstext35.dll
msxbse35.dll
MSJTOR35.DLL
MSJT4JLT.DLL
mdac_typ.exe 
msorcl32.dll 
msdaora.dll
خوب یعنی منظورتون اینه که اینها باید روی کامپیوتر هدف کپی شن ؟




> برای dll ها اکثرا کپی کردن آن ها در فولدر برنامه یا شاخه system32 کفایت می کند و کار خواصی نیاز نیست


شاخه سیستم رو مثل شکل زیر تعیین کنم و در اون فایلها رو کپی کنم ؟






> اما برای سایر موارد و ActiveX هایی که نیاز به رجیستر شدن دارند از همان regsvr32.exe با استفاده از دستور ( )system در C برای اجرای command استفاده کنید.


منظورم روش دستی این کار نیست میخوام بدونم که در یک فایل نصبی که خودکار این کارها رو انجام میده چطور رجیستر شدن یک اکتیوایکس رو اعمال کنم ؟

در مورد فایلها هم یک چیزی رو متوجه نمیشم :
شما خوتون به این صورت نوشتید :

"..\\images\\pic1.bmp" 
من هم مشکلم تو همین دو نقطه ای هست که در اول آدرس گذاشتید مثلا اکتیوایکسی که دستوری مثل open داره در برنامه چه کدی رو قرار بدم ؟

.open(“???”);متغیر کنترل 
اگه توضیح بیشتری بدید ممنون میشم .

----------


## Nima_NF

> من قصد دارم از امکانات خود visual stdio بهره ببرم یعنی در حقیقت میخواهم از setup and deployment در خود ویژوال استدیو استفاده کنم .
> فایلهای msm ؟ منظورتون دقیقا چیه ؟


اگر از setup خود VُS استفاده می کنید، بعد از اضافه کردن فایل اجرایی برنامه خودش اتومات نیازمندی ها تشخیص می دهد و msm ها را به setup اضافه می کند تا در هنگان نصب بدون هیچ کاری اتومات در ویندوز نصب شوند. نیاز به مسیر دادن نیز نیست.




> خوب یعنی منظورتون اینه که اینها باید روی کامپیوتر هدف کپی شن ؟


فقط dll های MFC و CRT که مسیرشان در آن فایل ذکر شده است نه همه DLL های ذکر شده در آن فایل.
ضمنا اصلا نیازی به کپی کردن دستی dll ها MFC و CRT نیست، پروژه setup خودش تشخیص می دهد و اضافه می کند (همانطور که در مورد قبل توضیح داده شد)، 
در هر حال خودتان می توانید در فولدری که فایل exe قرار دارد dll ها مورد نظر را دستی کپی کنید (البته نه در ویندوز) که نیاز نیست.




> شاخه سیستم رو مثل شکل زیر تعیین کنم و در اون فایلها رو کپی کنم ؟


اجباری نیست dll ها غیر سیستمی در شاخه های ویندوز کپی شود، کپی کردن در فولدری که فایل exe قرار دارد کافیست. 
در هر حال بله اگر خواستید به همان شکلی که در عکس نشان داده اید نیز درست هست.




> منظورم روش دستی این کار نیست میخوام بدونم که در یک فایل نصبی که خودکار این کارها رو انجام میده چطور رجیستر شدن یک اکتیوایکس رو اعمال کنم ؟


 اطلاع ندارم، احتمالا باید از اسکریپت نویسی و یا ساختن کلید های رجیستری در پروژه Setup این کار را انجام دهید که آسان نیست.




> من هم مشکلم تو همین دو نقطه ای هست که در اول آدرس گذاشتید مثلا اکتیوایکسی که دستوری مثل open داره در برنامه چه کدی رو قرار بدم ؟


"..\\images\\pic1.bmp"\\.. یعنی اینکه مسیر فولدر کنونی که فایل exe قرار دارد.

 ..\\pic1.bmp
open(“..\\pic1.bmp"); // just for example


مسیر فوق یعنی فایل در فولدر فایل اجرایی، چیز سختی نیست ...

----------


## shima_sa

من هم با مشکلی مشابه مواجه شدم یعنی برنامه هایی که با visual C++‎ ایجاد میکنم روی کامپیوتر های دیگه اجرا نمیشه . ممکنه 
راهنمایی بدید چطور میتونم اونا رو در کامپیوتر های دیگه هم اجرا کنم ؟
با این ارور مواجه میشم :

this appllication has faild to start because the application configuration is  
incorrect.reinstalling the application may fix this problem.

----------


## A_Salimi

ببينيد من هم با خطايي مشابه مواجه بودم (و هستم ) در هر حال مشکلات زيادي ميتونن دخيل باشند من با ويژوال استديو به جرات ميتونم بگم يک پروژه رو سي چهل بار کامپايل کردم ، حالات مختلفي رو تست کردم ، dll هاي مختلفي رو که در فايل redist.txt بود رو 
کنار فايلم کپي کردم فايلهاي msm که در موردشون بحث شد رو به پروژم اضافه کردم ، اما نشد که نشد . . . اما فکرايي دارم که در زير بهشون اشاره ميکنم :

فقط به عنوان چند تا راهنمايي عرض ميکنم : 

سيستم هدف را هم در نظر بگيريد که معمولا با پردازنده هاي x86 سر و کار داريم.

چيز ديگه اي که هنوز خودم آزمايش نکردم (و البته اميد زيادي بهش دارم ) استفاده از ابزاري هست که در ويژوال 6 وجود داره 

Star menu – Microsoft visual stdio 6.0 - Microsoft visual stdio 6.0 Tools – Depends

Depends  ابزاري است که توسط آن شما ميتوانيد dll هاي وابسته به يک فايل exe رو پيدا کنيد 

عکس زير محيطي از اين برنامه را نشان ميدهد که من فايل Test.exe (که توسط  mfcساخته بودم) را توسط اين برنامه باز کردم . . .


احتمالا با اين ابزار در کامپيوتر هدف ميتونين dll هايي رو که در اونجا نيستند رو شناسايي کنيد .
موفق باشيد

----------


## shima_sa

خوب من هم سعي ميکنم از اين ابزار استفاده کنم اگه شما موفق به اجرا شديد لطفا بي اطلاع نگذاريد

----------


## A_Salimi

من vc ورژن RTM  9.0.21022 را دارم .لطفا بگید کدام کدام فایل vcredist_x86 باید دانلود شود تا برنامه من 
در target های دیگر اجرا شود ؟
از کجا بدانم سرویس پک نصب شده است یا نه ؟
و چگونه فایل مطابق با ورژن vc خودم را پیدا کنم ؟ سوال من این است : آیا برای ورژن های مختلف vc فایلهای متفاوت vcredist_x86 موجود است ؟
با جستجو در Microsoft (وهمچنین با کمک مدیر بخش) چند فایل را پیدا کردم که نصب آنها هم هیچ تاثیری ندارد. 
یعنی این لینک ها (البته لینک sp1 را چک نکردم.) 

link1
link2
البته به دیلیل داشتن اینترنت dialup قادر نیستم همه فایلها را تک تک دانلود کنم و همه آنها را تست کنم.
برای آزمایش از برنامه هایی که مدیر بخش در لینک (برنامه های کوچک و کاربردی ...) مثل این را به همراه دانلود و نصب بسته مورد نظر در VMvare اجرا کردم که در آنجا اجرا شدند. اما برای اجرای برنامه های mfc هنوز مشکل دارم.

لطفا راهنمایی بدید.

----------


## Nima_NF

سرویس پک ها را باید خودتان جداگانه نصب کنید، پس اگر نکرده اید همان نسخه اصلی است.
در همان دیالوگ about نیز اگر نصب کرده باشید می نویسد که نسخه VC9 SP1 هست که برای شما نوشته نشده است پس همان معمولی است.
اما با هم نمی توان دقیق گفت که dll های شما چه نسخه ای است، ممکن است با windows update نسخه جدیدتر را گرفته باشید یا موارد مشابه. چرا که حتی تاریخ dll ها مهم است.

پس:
1) سعی کنید برای  vcredist_x86 از Setup VC استفاده کنید تا  vcredist_x86 رابا توجه به نسخه کاری VC برایتان بسازد (به صورت فایل جداگانه از setup.exe) و سپس از آن استفاده کنید. پس نیاز نیست از اینترنت دانلود کنید.

2) یا کلا برای انتشار setup بسازید

3) یا dll های مورد نیاز را از فولدر VC/redist کپی کنید کنار فایل اجرایی.

در هر حال از نسخه مناسب VC خودتان استفاده کنید و زیاد در اینترنت دنبال بسته نباشید.

----------


## A_Salimi

سلام
با تشکر از شما

فايل vcredist_x86.exe را توسط vc ساختم اما باز هم در target اجرا نشد .در نهايت به صورت تصادفي مسئله اي به ذهنم رسيد که منجر شد بتوانم جواب بگيرم و اون چیزی بود که واقعا من نميدونستم :

*فايل مورد نظر بايد در مد release کامپايل شود و نه در مد* *Debug*
*


*آیا شما این گفته را قبول دارید ؟ چون در برنامه ای که دارم و به دلیل استفاده از dll نمی توانم آن را بصورت Release کامپایل کنم . آیا در حالت دیباگ هم میتوان آن را منتشر کرد ؟*

*

----------


## Nima_NF

سوال عجیبی بود!
Debug فقط در سیستم هایی اجرا می شود که ++VC در آن نصب شده باشد و dll های مخصوص debug (که هم کندترند و هم سنگین تر) در آنجا نصب شده باشد.

همیشه وقتی کار debug برنامه تمام می شود باید برنامه را release کنید. debug ،نسخه کامپیوتر خودتان هست تا اشکالات احتمالی را برطرف کنیم. علاوه بر آن حجم فایل اجرایی در مد debug چند برابر حالت معمول است. برنامه بدون release برنامه نیست.

منظورتان را از "_به دلیل استفاده از dll نمی توانم آن را بصورت Release کامپایل کنم_" متوجه نشدم. فرق چندان خاصی بین آن دو در کامپایل وجود ندارد.

----------


## A_Salimi

> منظورتان را از "به دلیل استفاده از dll نمی توانم آن را بصورت Release کامپایل کنم" متوجه نشدم. فرق چندان خاصی بین آن دو در کامپایل وجود ندارد.


موضوع دقیقا از این قرار است که در زیر میگم :

زمانی که تازه برنامه نویسی را شروع کرده بودم ، بنده خدایی برای اینکه من بتوانم shamsi.dll را در برنامه ام صدا بزنم روش زیر را پیشنهاد کرد :

در این روش توسط CLR یک warrper برای آن ایجاد میشد که ترکیبی از ManagedCode و 
UnmanagedCode است.

يعني 

یعنی Common Language Runtime Support را روی Common Language Runtime Support 

(/clr)i
قرار مي گیرد.

و در ادامه dll را به صورت دستی از طریق منوی project و properties .... اضافه میکردم .

و با کدهایی نظیر  

using namespace ShamsiDLL;
این dll کاملا کار میکرد.

واقعیتش من قبل از اینکه روش استفاده با vcredist_x86 را فرابگیرم اونها را به صورت static لینک میکردم .

ولی در این برنامه با توجه به شرایطی که گفتم نه برنامه static لینک میشه و نه با استفاده از vcredist_x86 .

حالا به نظر شما آیا این روش اشکال دارد و همچنین آیا راهی برای کامپایل برنامه به صورت قابل اجرا در target های دیگر وجود دارد ؟

----------


## Nima_NF

shamsi یک dll از نوع شئی COM هست، من اگر جای شما بودن می رفتم به سراغ اینکه نحوه کار کردن با COM را در MFC یاد بگیرم و سپس آن را استفاده کنم. پروژه را هم به CLR تبدیل نمی کردم.
وقتی شما پروژه را به CLR تبدیل کردید، یعنی برنامه شما از Native خارج شده و باید NET Framework. را هم در سیستم هدف نصب کنید.

برای یک مثال

----------


## A_Salimi

به دليل دشواري استفاده از COM از اين روش استفاده كردم .

به عنوان آخرين سوال :

آيا استفاده از CLR دليلي براي Relese نشدن پروژه است ؟ مي خواهم بدانم چرا با اين روش نه استاتيك كامپايل ميشود و نه Relese ميشود؟

با تشكر

----------


## Nima_NF

شما در properties پروژه باید همانطور که در مد debug کتابخانه ها را به linker اضافه کردید و CLR را فعال کردید، در حالت انتخابی release نیز مجددا این اعمال را انجام دهید. هر کدام تنظیمات خودش را دارد.

----------


## A_Salimi

دقیقا همون طوری که شما گفتید بود. و پروژه بصورت Relese  هم کامپایل شد.

*معذرت* ، قرار بود پست قبلی سوال آخر باشه .در هر حال شما که همیشه به ما لطف  دارید در صورت امکان به این چند سوال دیگر من هم اگر مقدور بود پاسخ دهید :

سوال 1 –

شما گفتید که برای اجرای clr به نصب دات نت فریم ورک در کامپیوتر Target نیاز داریم .الان در Add or Remove programsدر کنترل پنل من سه تا ورژن مختلف از دات نت فریم ورک نصب است شکل زیر :



در کامیوتر میزبان کدام را نصب کنم ؟

ضمن اینکه درproperties پروژه من ورژن دو را مطابق شکل زیر دیدم .آیا همین نسخه مورد نیاز است ؟



سوال 2 –

آیا این نسخه هم توسط vc باید ساخته شود ؟

من با توجه به شکل نسخه مورد نیاز را میسازم :



پوشه ای به نام DotNetFX ساخته ميشود که حاوي چند فايل است .آیا روش فوق درست است و نیازی به اضافه کردن مورد دیگری نیست ؟

سوال 3 :

گاهی پیش می آید که از Activex ی به صورت تصادفی استفاده میکنم و مثلا برای نمایش یک عکس از آن بهره می برم (مثلا با دیدن کلمه image در نام آن اکتیوایکس ).سوالی که پیش می آید این است که خود آن Activex را چطور در سیستم پیدا کنم تا در کامپیوتر مقصد کپی و رجیستر کنم ؟ منظورم این است که در لیست اکتیوایکسها ما فقط اسم آنها را می بینیم از کجا بدانیم که هر اکتیوایکس با چه اسمی و در کجای سیستم ذخیره شده است ؟ 

با تشکر

----------


## Nima_NF

1- دقیقا همان نسخه ای که در properties پروژه شما تعیین شده است و پروژه شما بر اساس آن کامپایل می شود، که برای شما .NET 2 است، پس همان را در setup اضافه کنید.

2- بله همین کار کافیست، فقط یک برنامه نویس خوب باید جدیدترین بسته .NET را از اینترنت دریافت کند. از طریق آن گزینه آبی با عنوان ...check Microsoft update for more می توانید به سایت اصلی رفته و جدید ترین بسته bootstrapper packages را برای .NET دانلود کنید تا امنیت و خطاها برای کاربر شما نیز برطرف شود (در حال حاضر جدید ترین نسخه بسته SP2 برای .NET 2 است)، اگر هم خیلی ضروری نیست از همان نسخه داخلی VC که تیک زدید استفاده کنید و دانلود نکنید.

3- دقیق نمی دانم، معمولا وقتی از چیزی استفاده می کنیم باید بدانیم از کجا نصب می شود، مثلا از flash باشد می دانیم که باید به کاربر بگوییم Flash را نصب کند، یا مثلا quick-time را، یا ....

----------


## vahid javani

درود
من تازه کار هستم و زیاد از اطلاعات این تاپیک سر در نیاوردم!!
اگه امکان داره یه توضیح ساده بدید!
میخوام کدهای C++‎ که با vs2010 نوشتم رو به برنامه نصبی یا فایل اجرایی تبدیل کنم(دیگه dll کپی نکنم)

----------


## ASGGSA

سلام.
شما در منو Build در قسمت Configuration Manager باید حالت Release را انتخاب کنید و بعد بوسیله کلیدهای Ctrl+F5 خروجی برنامتون رو بگیرید. حالا بروید در فولدر پروژتون در فولدر Release فایل EXE برنامتون را بردارید و روی هر کامپیوتری که خواستید اجراش کنید.
موفق باشید.

----------


## ASGGSA

سلام.
خوب دوست عزیز زودتر بگو می خوام Setup بسازم. بعد از اجرای Visual ، در منو File گزینه New و بعد New Project رو انتخاب کن در این پنجره که ظاهر می شه Other Project Types رو انتخاب بعد گزینه Setup and deployment را انتخاب کن حالا باید Setup project رو انتخاب کنی بعد از وارد کردن name و Location دکمه OK رو بزن.
حالا در قسمت Solution Explorer می توانی User Interface Editor را انتخاب کنی و مراحل نصب یه برنامه رو بوسیله Properties تغییر بدی و برای وارد کردن فایل های برنامت باید در همان قسمت قبلی File System Editor را انتخاب کنی که در اینجا مکان ها را به شما نشان می دهد( مثلاً دسکتاپ یا prgrams menu ) که تعیین می کنی برنامت در کجا ها کپی بشه. البته خیلی آسونه یکمی کار کنی یاد می گیری و من هم نمی تونم اینجا همه را برات توضیح بدم. اگه بازم به مشکلی برخوردی بپرس.
موفق باشی.

----------


## dorryaft

*سلام
یک سوال در رابطه با کامپایل برنامه دارم.

خیلی از برنامه ها را دیده ام که برای اجرا شدن و حتی نصب شدن نیاز به نت فروم ورک دارند.

حالا سوال من اینه که می تونیم برنامه را به گونه ای منتشر کنیم که نیازی به نت فروم ورک نداشته باشه و کد هایی که ازش استفاده کرده به خود برنامه اضافه بشه؟

ممنون*

----------

