برگزیده های پرشین تولز

اجراي كامل يك فايل exe ديگر در VB

b7rv1

کاربر تازه وارد
تاریخ عضویت
2 مارس 2009
نوشته‌ها
13
لایک‌ها
0
با سلام

من مي‌خوام يه فايل exe رو كه تحت داس كار مي‌كنه در برنامه خودم استفاده كنم. يعني پارامتر ها و نامهايي كه بايد در اون برنامه نوشته بشه تا برنامه جواب نهايي رو بده من با برنامه نويسي به اون بدم . يعني برنامه‌اي بنويسم كه ورودي هايي كه من مي‌خوام بگيره و با استفاده از يك برنامه خارجي خروجي‌هاي اون برنامه خارجي رو توليد كنه.
آيا اصولا ميشه از يك برنامه ديگر كه به صورت exe در اومده در برنامه خودمون استفاده كنيم و مثل يك تابع يا روال به اون پارامتر بفرستيم و جواب از اون بگيريم؟
شايد بشه فايل exe رو مثل يك item وارد كل پروژه كرد. شايد هم با ابزار Process بشه كاري كرد.

قبلا از همكاري تمام عزيزان تشكر مي‌كنم.
 

igimax

کاربر فعال کامپیوتر
تاریخ عضویت
17 سپتامبر 2004
نوشته‌ها
3,410
لایک‌ها
1,348
سن
49
سلام b7rv1 عزيز

. اگر فايل داسي شما پارامتر‌هاي خودش را مي‌تواند در Prompt بپذيرد و اگر نتيجه كارش را مي‌تواند در محيط داس و خط فرمان ننمايش دهد؟! (همانند دستور mem.exe) اون وقت ميشه كاريش كرد. اما اگر اينطور نيست من اطلاع ندارم كه چطور بايد مشكل را حل كرد.

. اگر حالت اول امكانپذير هست كه به راحتي مي‌توانيد به كمك تابع Shell از ويژال فرمان داس را با پارامتر‌‌هاي دلخواهتان اجرا نماييد و در پايان آن بايد از كاراكتر < كه خروجي فايل را به فايلي ارجاع مي‌دهد استفاده نماييد. براي مثال همين دستور mem.exe از داس:

mem.exe /c > resualt.txt

. به اين شكل نتيجه فايل mem با سويچ c/ به فايل متني به نام resualt.txt منتطق مي‌شود و شما مي‌توانيد آن فايل متني را به كمك دستورات بيسك بخوانيد.

موفق باشيد.

خداحافظ
IgImAx
88/03/30
 

b7rv1

کاربر تازه وارد
تاریخ عضویت
2 مارس 2009
نوشته‌ها
13
لایک‌ها
0
igimaxعزيز:)

بله اين برنامه من تحت داس اجرا ميشه و ورودي هاي اون از يك فايل گرفته ميشه كه نام اون فايل متني رو بايد در خط فرمان برنامه تايپ كرد خروجي اون هم يك فايل متني است. با خروجي مشكلي ندارم فقط مي‌خوام وقتي برنامه اجرا شد به برنامه بگم از فايل متني من داده ها رو بگيره و فايل متني خودشو ايجاد كنه.

شما گفتيد كه با shell ميشه لطفا مثالي بزنيد كه اين كاري كه من مي‌خوام رو انجام بده.

با تشكر فراوان از شما ;)
 

igimax

کاربر فعال کامپیوتر
تاریخ عضویت
17 سپتامبر 2004
نوشته‌ها
3,410
لایک‌ها
1,348
سن
49
سلام b7rv1 عزيز

. خوب فرض كنيم نام برنامه اجرايي تحت داس شما sample.exe هست و نام فايل متني وروديتان Data.txt هست و هردو در ريشه درايو C هستند. دستور Shell را بايد در درون برنامه خود به اين شكل بنويسيد:

Shell ("C:\sample.exe data.txt")
o
. با اين دستور برنامه sample در محيط داس اجرا و ورودي‌هاي خود را از data.txt مي‌گيرد و نتيجه را مثلن در Result.txt ذخيره مي‌نمايد. حالا لازم هست كه محتويات فايل Result.txt را بخوانيم. قبلن در اين آدرس روش خواندن فايل‌هاي متني و باينري را توضيح داده‌ام. اگر به هر دليلي در نوشتن نام فايل و پارامترهايش مشكلي پيش آمد، مي تواني آنها را در يك فايل bat بنويسي و آن فايل bat را صدا بزني. مثلن run.bat نام فايل باشد و در درون آن نام برنامه داسي + پارامتر هايش را بنويس.


موفق باشيد.

خداحافظ
IgImAx
88/03/31
 

b7rv1

کاربر تازه وارد
تاریخ عضویت
2 مارس 2009
نوشته‌ها
13
لایک‌ها
0
:)با تشكر فراوان از igimax عزيز:)

ممنونم كه با توضيحات كامل جواب ميدين

اما با اين روشي كه فرمودين مشكل من حل نشد ممكنه از نسخه VB من باشه من از VB2005 كه از بازار خريدم كار مي‌كنم اينو گفتم چون من MSDN رو هم نصب كردم ولي هرچي توي MSDN ميگه وقتي عينا به برنامه منتقل مي‌كنم ايراد ميگيره!!!؟؟؟ :( .مثلا اين كد:

>Tools.Shell /output cmd /c dir /s /b """c:\My Documents\*.doc"""

و از اونجايي كه من با فايلهاي *.bat هم آشنايي ندارم نتونستم فايل *.bat ي كه اين كار رو انجام بده بنويسم لطف كنيد مثالي از اون روش هم بزنيد شايد مشكل حل شد خيلي لازمش دارم.

با تشكر فراوان ;)
 

igimax

کاربر فعال کامپیوتر
تاریخ عضویت
17 سپتامبر 2004
نوشته‌ها
3,410
لایک‌ها
1,348
سن
49
سلام b7rv1 عزيز
1538.gif


. ممنون از لطفت، خوشحال مي‌ش.م بتوانم كمكي كنم....

....
به برنامه منتقل مي‌كنم ايراد ميگيره!!!؟؟؟ :( .مثلا اين كد:
>Tools.Shell /output cmd /c dir /s /b """c:\My Documents\*.doc"""
....
. من متوجه نشدم اين Tools.Shell چيه ديگه!؟ اما تابع Shell به شكل عادي قابل استفاده هست. البته شايد در نسخه 2005 نياز باشه كه از يه سري Namespace قبلش استفاده نماييد. (مثلن چيزي شبيه اين System.Shell) اما در 2008 تابع Shell Function در MSDN به اين شكل هست: لينك را مطالعه نماييد. پس Syntax اين تابع به شكل زير هست:

کد:
Public Function Shell( _
   ByVal PathName As String, _ 
   Optional ByVal Style As AppWinStyle = AppWinStyle.MinimizedFocus, _ 
   Optional ByVal Wait As Boolean = False, _ 
   Optional ByVal Timeout As Integer = -1 _
) As Integer
. در مثالي ديگر به نمونه كدي كه نوشتم توجه نماييد:
کد:
[LEFT][COLOR=Blue]Public Class[/COLOR] Form1

    [COLOR=Blue]Private Sub[/COLOR] Button1_Click([COLOR=Blue]ByVal [/COLOR]sender [COLOR=Blue]As [/COLOR]System.Object, [COLOR=Blue]ByVal [/COLOR]e [COLOR=Blue]As [/COLOR]System.EventArgs) [COLOR=Blue]Handles[/COLOR] Button1.Click
        Shell("[COLOR=DarkRed]c:\1.bat[/COLOR]")
        Shell("[COLOR=DarkRed]mem /c > c:\2mem.txt[/COLOR]", AppWinStyle.Hide, [COLOR=Blue]True[/COLOR])
        Shell("[COLOR=DarkRed]c:\windows\notepad.exe c:\2mem.txt[/COLOR]", AppWinStyle.NormalFocus)
[COLOR=Blue]    End Sub

End Class[/COLOR][/LEFT]

. در كد تابع Sell اول فايل o1.batرا اجرا مي‌كند. نوشتن فايل Batch فايل خيلي سادست! يك فايل Text معمولي درست نماييد، سپس پسوندش را به bat تغيير دهيد! حالا فرمان‌هايي كه در Prompt داس پشت سر هم مي‌نويسيد را درون آن و در خطوط مجزا بنويسيد. براي اينكه در زمان اجراي فايل bat، خود دستورات نشان داده نشوند مي‌توانيد در خط اول دستور o@Echo off را بنويسيد. براي مثال كد موجود در فايل o1.batاين هست:
o
@ECHO OFF
DIR /W > C:\1dirC.txt
DIR C:\Windows >C:\1dirWin.txt
DIR "C:\Documents and Settings" > C:\1dirDocs.txt
MD C:\Test
CD C:\Test
C:
DIR >C:\1dirTest.txt

. در Shell دوم هم خروجي برنامه MEM در فايلي ذخيره مي‌شه اما چون قرار نتيجه آن در Shell بعدي در برنامه Notepad ويندوز نمايش داده بشه پس من پارامتر سوم را True گذاشتم كه به معني توقف در همين دستور هست تا زماني كه كار برنامه صدا زده شده در آن به اتمام نرسيده است.

. در Shell سوم هم كه برنامه Notepad فايل خروجي دستور MEM را از Shell پيشين را نمايش مي‌دهد.

. توجه نماييد زماني نياز هست از " هاي چندتايي استفاده نماييد كه در بين Path (مسير) برنامه يا نام آن يا پارامتر‌ها و سويچ‌هاي آن (اگر پارامتر‌هايش چند حرفي و چند كلمه‌اي باشند) Space (فاصله) وجود داشته باشد.

پ.ن.: (چون Shell يك تابع هست و مقداري را باز مي‌گرداند، كه در اينجا يه عدد Integer هست و نشان دهنده Process ID برنامه هست، اگر نمي‌خواهيد از مقدار بازگشتي آن استفاده نماييد، بهتر هست قبل از نام اين تابع دستور Call را بنويسيد، كه اصوليتر و صحيتر باشه!)

موفق باشيد.
67562.gif


خداحافظ
IgImAx
88/04/01
209266.gif
26650.gif
 
Last edited:

b7rv1

کاربر تازه وارد
تاریخ عضویت
2 مارس 2009
نوشته‌ها
13
لایک‌ها
0
igimax جان
باز هم با تشكر فراوان از شما بخاطر توجهتون و اينكه وقت ميگذاريد.

اين كارها رو من هم مي‌تونم با برنامه هاي notepad و غيره انجام بدم يعني يك فايل متني به راحتي در notepad باز مي‌شه. اما مشكل من با برنامه خاصي هستش كه دارم.
من با همچين فايل exeاي كار مي‌كنم كه همون فايل كنار اون هم وروديشه. برنامه رو اجرا مي‌كنيد. نام فايل كناري رو (beem) وارد ميكنيد بعد عدد 4 رو وارد ميكنيد يعني مقياس شما متر هستش بعد برنامه 3 فايل ديگه ايجاد مي‌كنه. من چه جوري مي‌تونم اين كار رو با استفاده از VB انجام بدم؟
بايد بگم كه من هم VS2008 رو خريداري كردم و الان با اون كار مي‌كنم.

با تشكر فراوان.
 
Last edited:

igimax

کاربر فعال کامپیوتر
تاریخ عضویت
17 سپتامبر 2004
نوشته‌ها
3,410
لایک‌ها
1,348
سن
49
سلام b7rv1 عزيز
1538.gif


. آقا خوب شد كه نمونه فايل را گذاشتيد! (اين فايل و فايل beem برام آشناست!! يكي از دوستان مخابراتيم كه در نصب موبايل هست يه بار يه همچين چيزايي از من پرسيد!؟) چون معلوم شد كه در توضيحاتتان يه اشتباهي داشتيد!! اين برنامه شما داده‌‌ها را نمي‌تواند از خط فرمان بگيرد بلكه ابتدا اجرا مي‌شود و سپس در دو ورودي متفاوت از كيبورد، داده‌ها را دريافت مي‌كند. بر خلاف دستور MEM كه سويچش در جلويش نوشته مي‌شود. شكل ورودي اين برنامه به اين صورت هست:



پس! براي رفع اين مشكل بايد از علامت > كه ورودي را از كيبورد به يك فايل يا هر چيز ديگري تغيير مي‌دهد استفاده نماييم. يك فايل با هر نام و هر پسوندي (يا بدون پسوند!) ايجاد مي‌كنيم و در آن دو خط زير را بنويسيد و در انتهاي آن كليد Enter را بزنيد:

beem
4

. (مثلن اسمش data باشد) حالا يك بچ فايل به نام run.bat درست نماييد و محتوياتش اين باشد:
o
@ECHO OFF
proper.exe < data

. حالا كافيه كه در تابع Shell نام فايل Run.bat را ذكر نماييد. اتفاقي كه اينجا ميفته اين هست كه، خط اول پچ فايل ميگه خود دستور را نشان نده و خط دوم اول برنامه Proper را اجرا مي‌كند و خط ورودي اول نمايش داده مي‌شود اما كاركتر > به برنامه ميگه كه ورودي را از فايل data بگيره و در فايل data اول نوشته شده beem اين عبارت در جلوي ورودي اول برنامه نوشته مي‌شود اما خوب كليد enter را كي ميزنه؟!؟!؟ قبلن شما در اون فايل براي رفتن به خط بعدي كاراكتر Enter را وارد نموديد اگر چه آن را نمي‌بينيد! اما موجود هست. پس به شكل اتوماتيك كليد Enter فشرده و خط بعدي و ....

. براي راحتي و اصوليتر شدن برنامه‌تان فايل Run.bat را كنار فايل اجرايي تان قرار دهيد (به همراه فايل‌هاي proper و beem)، اما آدرس مكان فايل اجرايي را از كجا به دست آوريم!؟ از تابع زير:

Application.StartupPath

. اگر برنامه شما در هر فولدري باشد مسير آن به شكل كامل و به شكل String بازگشت داده مي‌شود ولي در انتهاي نام آن كاراكتر \ قرار داده نميَ‌شود.(مانند C:\Test) اما اگر برنامه شما در Root هر درايوي باشد نام آن درايو بازگشت داده مي‌شود كه در انتهاي آن كاراكتر \ به معني Root موجود هست (مثل \:C) چون از اين تابع + نام فايل run.bat در دستور Shell مي‌خواهيم استفاده نماييم بايد مطمئن شويم كه بين نام اين دو حتمن كاراكتر \ قرار گيرد، پس بايد يك كد كنترلي هم بنويسيم كه نتيجه مي‌شود اين:

کد:
[COLOR=Blue]Public Class[/COLOR] Form1
[COLOR=Blue]
    [/COLOR][COLOR=Blue]Private Sub Button1_Click([/COLOR][COLOR=Blue]ByVal sender As System.Object, ByVal [/COLOR]e [COLOR=Blue]As [/COLOR]System.EventArgs) [COLOR=Blue]Handles[/COLOR] Button1.Click
        [COLOR=Blue]Dim [/COLOR]s_ApplicationPath [COLOR=Blue]As String[/COLOR]
        [COLOR=Blue]Dim [/COLOR]s_BatchFilename [COLOR=Blue]As String[/COLOR]

        s_BatchFilename =[COLOR=DarkRed] "run.bat"[/COLOR]

        s_ApplicationPath = Application.StartupPath
[COLOR=SeaGreen]        ' Lets to be sure that \ is exist at the end of above path...[/COLOR]
        [COLOR=Blue]If [/COLOR]Microsoft.VisualBasic.Right(s_ApplicationPath, 1) <>[COLOR=DarkRed] "\"[/COLOR] [COLOR=Blue]Then[/COLOR]
            s_ApplicationPath = s_ApplicationPath &[COLOR=DarkRed] "\"[/COLOR]
        [COLOR=Blue]End If[/COLOR]

        Shell(s_ApplicationPath & s_BatchFilename, AppWinStyle.Hide, [COLOR=Blue]True[/COLOR])

[COLOR=SeaGreen]        ' write here the other statements
        ' ....
        ' ....
        ' ....
[/COLOR]
   [COLOR=Blue] End Sub[/COLOR]

[COLOR=Blue]End Class[/COLOR]
موفق باشيد.
67562.gif


خداحافظ
IgImAx
88/04/05
209266.gif
26650.gif
 
Last edited:

b7rv1

کاربر تازه وارد
تاریخ عضویت
2 مارس 2009
نوشته‌ها
13
لایک‌ها
0
با تشكر فراوان از igimax عزيز

واقعا ممنونم چون مشكلم كاملا حل شد. شما درست فرمودين اطلاعات رو بايد از كيبورد به برنامه مي‌داديد تا اجرا بشه. از اينكه وقت گذاشتين و راهنمايي كردين متشكرم.

فقط يه مشكل كوچيك وجود داره من سعي كردم اين كار رو با فايلهاي لازم در شاخه‌اي غير از شاخه اجراي برنامه انجام بدم ولي انجام نشد. يعني برنامه كاملا اجرا مي‌شه و ارور يا پيغامي ‌هم نميده ولي اون فايلهايي كه برنامه بايد ايجاد كنه ايجاد نمي‌شه.
من به برنامه خودتون اين خط كد رو اضافه كردم
s_ApplicationPath = s_ApplicationPath & "File\"​

يعني مي‌خوام برنامه هاي اضافي در شاخه اي در كنار برنامه باشن يا مثلا اينكه در شاخه ويندوز باشن تا كاربر از اونا اطلاعي پيدا نكنه. اگر لطف كنيد و اين مشكل رو هم جواب بدين ممنون ميشم.

با تشكر فراوان
 
Last edited:

igimax

کاربر فعال کامپیوتر
تاریخ عضویت
17 سپتامبر 2004
نوشته‌ها
3,410
لایک‌ها
1,348
سن
49
سلام b7rv1 عزيز
1538.gif


. دوباره خواهش مي‌كنم و خوشحالم كه مفيد واقع شده. اگر اون كد را بعد از دستور IF گذاشتيد درسته اما اگر قبل از دستور IF بوده اشتباست. در مورد فولدر وينوز هم مشكي نداره! اتفاقن خيلي هم خوبه چون در Path داس فولدر C:\Windows و C:\Windows\System32 هر دو موجودند و هر فايلي در آنها باشد از هر جايي قابل اجرا و صدا زدن هست.

موفق باشيد.
67562.gif


خداحافظ
IgImAx
88/04/08
209266.gif
26650.gif
 

b7rv1

کاربر تازه وارد
تاریخ عضویت
2 مارس 2009
نوشته‌ها
13
لایک‌ها
0
با سلام دوباره خدمت igimax عزيز

ميشه اين فايل هاي .exe رو در resource برنامه قرار بدم و اونا رو اجرا كنم؟ يا اينكه اونارو هروقت كه مي‌خوام به شاخه اصلي برنامه كپي كنم؟

با تشكر
 

igimax

کاربر فعال کامپیوتر
تاریخ عضویت
17 سپتامبر 2004
نوشته‌ها
3,410
لایک‌ها
1,348
سن
49
سلام b7rv1 عزيز
1538.gif


. متاسفانه مدتي هست كه از برنامه نويسي فاصله گرفتم! و Resource و امكاناتش را يادم رفته! اما اگر حدف شما اينه كه وقتي برنامه اصلي را اجرا مي‌كنيد، برنام تون اول از وجود فايل‌ يا فايل‌هاي خاصي در ريشه خودش مطمئن بشه بعد اگر بودند يه سري عمليات روشون انجام يشه و اگر نبودند برنامه اصلي به كار‌هاي خودش بپردازه؟!

. تابع FileExist اينكار رو براتون انجام ميده، توضيح كاملش اينجاست و يك مثال ساده:


If
My.Computer.FileSystem.FileExists("c://Check.txt") Then
...MsgBox("File found.")
Else
...MsgBox("File not found.")
End If

. به اين شكل مي‌توانيد كار‌هايي كه مي‌خواهيد در صورت وجود يك فايل انجام بگيره را با اين تابع و كنترل فوق انجام دهيد.

موفق باشيد.
67562.gif


خداحافظ
IgImAx
88/04/08
209266.gif
26650.gif
 

b7rv1

کاربر تازه وارد
تاریخ عضویت
2 مارس 2009
نوشته‌ها
13
لایک‌ها
0
با تشكر از igimax عزيز

خير منظور من اين بود كه اين فايل ها رو به همراه برنامه به كامپيوتر مقصد منتقل كنم و در اون كامپيوتر اونا رو اجرا كنم يا از درون برنامه ( بدون وجود هيچ برنامه خارجي كنار برنامه اصلي ) به كامپيوتر مقصد كپي كنم.
من عكس ها رو به اين صورت منتقل كردم و در برنامه اجرا مي‌شه و به فايلهاي خارجي احتياج نداره، مي‌خواستم بدونم مي‌شه با فايلهاي ديگه مثلا exe يا هر پسوند ديگه‌اي اين كار رو انجام داد.

باتشكر از توجهتون
 
Last edited:
بالا