PDA

View Full Version : مشکلی عجیب در ویندوز های 64 بیتی



mehran901
جمعه 21 تیر 1392, 00:49 صبح
سلام بر دوستان

من میبایست در مرحله ای از برنامم از ساب کی مشخصی در رجیستری بک آپ تهیه کنم این کارو توسط داس به راحتی میشه انجام داد به طور مثال :

Shell "cmd.exe /k regedit.exe /e c:\1223.reg " & Chr(34) & "HKEY_LOCAL_MACHINE\SOFTWARE" & Chr(34),vbhide


همون طور که مشخص هست بک آپ در فایل 1223 در مسیر مشخص شده گرفته میشه ... خب حالا مشکل کجاست ؟

این دستور در ویندوز های 32 بیتی که مشکلی نداره ولی در 64 بیتی ها : اگه به صورت دستی بخوایم بک آپ بگیریم مشکلی نداره ! عین همین سینتکس رو داره ولی توسط ویبی که اجرا میشه ! بک آپ گرفته نمیشه :| (برنامه ران از ادمین هم شده بود!)



از دوستان کسی چیزی به ذهنش میرسه ؟

تشکر

mehran901
جمعه 21 تیر 1392, 12:18 عصر
کسی نظری نداره ؟ :افسرده:

AbbasVB
جمعه 21 تیر 1392, 12:56 عصر
درود
چرا از CMD استفاده می کنی؟
این برنامه رو برای نوشتم ویندوزم X64 و درست کار می کنه

دریافت (http://barnamenevis.org/barnamenevis.org/attachment.php?attachmentid=107083&d=1373619539)

تا درودی دیگر بدرود

mehran901
جمعه 21 تیر 1392, 13:07 عصر
درود
چرا از CMD استفاده می کنی؟
این برنامه رو برای نوشتم ویندوزم X64 و درست کار می کنه

دریافت (http://barnamenevis.org/barnamenevis.org/attachment.php?attachmentid=107083&d=1373619539)

تا درودی دیگر بدرود
سلام ،

چرا از cmd ؟ چون خیلی ساده نیازمونو برطرف میکنه

شما تست کردین درست جواب داد ؟! یعنی با استفاده از ویبی اینو اجرا کردین فایل بک آپ ساخته شد ؟! پس من چرا هرکاری میکنم نمیشه ! ولی دستی تو داس دستورات رو بتایپیم مشکلی نیست

فایل ضمیمتون مشکلی داره فکر میکنم درسته ؟

AbbasVB
جمعه 21 تیر 1392, 13:13 عصر
منظورم این بود که برای اجرای Regedit.exe نیازی به cmd.exe نیست!
cmd.exe /k regedit.exe /e این نه!
regedit.exe /e این بهتره
برای من که جواب داد
یه کلاس داشتم که این کار رو با با کد نویسی انجام داده بود و نیازی به استفاده از ویرایشگر ریجستری نبود دارم می گردم اگه یافتمش می گذارمش

فایل ضمیمتون مشکلی داره فکر میکنم درسته ؟
شرمنده یادم رفته بود قرار بدم :خجالت:

miladatashin
جمعه 21 تیر 1392, 13:42 عصر
exe برنامتون رو تو مد 32(یا xp) بیتی اجرا کنید. ببینید مشکل حل میشه
مراحل واسه این کار
1-کلیک راست رو exe برنامه و بعد کلیک روی Properties
2- کلیک روی تب Compatibility
3- انتخاب Run this program in compatibility mode
و ....

mehran901
جمعه 21 تیر 1392, 13:45 عصر
exe برنامتون رو تو مد 32(یا xp) بیتی اجرا کنید. ببینید مشکل حل میشه
مراحل واسه این کار
1-کلیک راست رو exe برنامه و بعد کلیک روی Properties
2- کلیک روی تب Compatibility
3- انتخاب Run this program in compatibility mode
و ....

به زودی تست میکنم مرسی

mehran901
یک شنبه 23 تیر 1392, 20:37 عصر
exe برنامتون رو تو مد 32(یا xp) بیتی اجرا کنید. ببینید مشکل حل میشه
مراحل واسه این کار
1-کلیک راست رو exe برنامه و بعد کلیک روی Properties
2- کلیک روی تب Compatibility
3- انتخاب Run this program in compatibility mode
و ....

سلام ، با هیچ کدوم از این روش ها مشکل حل نشد !!

وقتی به طور مثال با دست تو cmd ، ی فرمانی رو تایپ کنی و اجرا کنی اجرا میشه ! ولی اگه اون صفحه داس توسط برنامه من باز شده باشه فرمان ها اجرا نمشن ران از ادمین هم هست نمیدونم چیکار کنم دیگه.... یکی راه کار بده تنکیو.... :عصبانی++:
:متفکر::اشتباه::افسرده:

m.4.r.m
دوشنبه 24 تیر 1392, 00:24 صبح
دوست عزیز ببین کدوم به دردت می خوره :

Dim lRet as long
lRet = Shell("C:\Windows\regedit.exe /e C:\Blah.txt HKEY_CURRENT_USER\SOFTWARE", vbNormal)



Private Declare Function GetWindowsDirectory Lib "kernel32.dll" Alias "GetWindowsDirectoryA" ( _
ByVal lpBuffer As String,
ByVal nSize As Long) As Long

Dim lRet, lngDir as long
Dim strWindowsDir As String

strWindowsDir = Space(255) ' Create a buffer string to hod the directory.
lngDir = GetWindowsDirectory(strWindowsDir, 255) ' Call the API function with our buffer and the bufer length.
strWindowsDir = Left$(strWindowsDir, lngDir) ' Strip the unwanted stuff off the end.
lRet = Shell(strWindowsDir & "\regedit.exe /e C:\Blah.txt HKEY_CURRENT_USER\SOFTWARE", vbNormal) ' Create the final execution!



Private Const HKEY_CURRENT_USER = &H80000001

Private Declare Function RegSaveKey Lib "advapi32.dll" Alias "RegSaveKeyA" ( _
ByVal hKey As Long, _
ByVal lpFile As String, _
lpSecurityAttributes As SECURITY_ATTRIBUTES) As Long

Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" ( _
ByVal hKey As Long, _
ByVal lpSubKey As String, _
phkResult As Long) As Long

Dim lngRet, lngKeyVal As Long
Dim strKey As String
strKey = "Software\America Online" & Chr(0)
lngKeyVal = RegOpenKey(HKEY_CURRENT_USER, strKey, 0&)
lngRet = RegSaveKey(lngKeyVal, "C:\SomeFile.txt", vbNullString)
If lngRet = 0 Then
' It worked!
End If



Shell "REGEDIT /E C:\test.REG ""HKEY_CURRENT_USER\Software\America Online""", vbHide


Option Explicit

Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, _
ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

Private Const SW_SHOWNORMAL As Long = 1
Private Const SW_HIDE As Long = 0

Private Sub Command1_Click()
Dim lRet As Long
lRet = ShellExecute(Me.hwnd, "Open", "C:\Windows\regedit.exe", " /e C:\Test.txt HKEY_CURRENT_USER\Software\America Online", "C:\", SW_SHOWNORMAL)
If lRet < 32 Then
MsgBox "Error"
Else
MsgBox "Done"
End If
End Sub


TempStr = "REG EXPORT " + Chr(34) + "HKCU\Software\VB and VBA Program Settings\ANIco.in\OneClick Go!" + Chr(34) + " " + Chr(34) + App.Path + "\BackUp.REG" + Chr(34)
Shell TempStr, vbHide

mehran901
دوشنبه 24 تیر 1392, 01:42 صبح
دوست عزیز ببین کدوم به دردت می خوره :

Dim lRet as long
lRet = Shell("C:\Windows\regedit.exe /e C:\Blah.txt HKEY_CURRENT_USER\SOFTWARE", vbNormal)



Private Declare Function GetWindowsDirectory Lib "kernel32.dll" Alias "GetWindowsDirectoryA" ( _
ByVal lpBuffer As String,
ByVal nSize As Long) As Long

Dim lRet, lngDir as long
Dim strWindowsDir As String

strWindowsDir = Space(255) ' Create a buffer string to hod the directory.
lngDir = GetWindowsDirectory(strWindowsDir, 255) ' Call the API function with our buffer and the bufer length.
strWindowsDir = Left$(strWindowsDir, lngDir) ' Strip the unwanted stuff off the end.
lRet = Shell(strWindowsDir & "\regedit.exe /e C:\Blah.txt HKEY_CURRENT_USER\SOFTWARE", vbNormal) ' Create the final execution!



Private Const HKEY_CURRENT_USER = &H80000001

Private Declare Function RegSaveKey Lib "advapi32.dll" Alias "RegSaveKeyA" ( _
ByVal hKey As Long, _
ByVal lpFile As String, _
lpSecurityAttributes As SECURITY_ATTRIBUTES) As Long

Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" ( _
ByVal hKey As Long, _
ByVal lpSubKey As String, _
phkResult As Long) As Long

Dim lngRet, lngKeyVal As Long
Dim strKey As String
strKey = "Software\America Online" & Chr(0)
lngKeyVal = RegOpenKey(HKEY_CURRENT_USER, strKey, 0&)
lngRet = RegSaveKey(lngKeyVal, "C:\SomeFile.txt", vbNullString)
If lngRet = 0 Then
' It worked!
End If



Shell "REGEDIT /E C:\test.REG ""HKEY_CURRENT_USER\Software\America Online""", vbHide


Option Explicit

Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, _
ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

Private Const SW_SHOWNORMAL As Long = 1
Private Const SW_HIDE As Long = 0

Private Sub Command1_Click()
Dim lRet As Long
lRet = ShellExecute(Me.hwnd, "Open", "C:\Windows\regedit.exe", " /e C:\Test.txt HKEY_CURRENT_USER\Software\America Online", "C:\", SW_SHOWNORMAL)
If lRet < 32 Then
MsgBox "Error"
Else
MsgBox "Done"
End If
End Sub


TempStr = "REG EXPORT " + Chr(34) + "HKCU\Software\VB and VBA Program Settings\ANIco.in\OneClick Go!" + Chr(34) + " " + Chr(34) + App.Path + "\BackUp.REG" + Chr(34)
Shell TempStr, vbHide



سلام و تشکر ،

همه مواردی که شما بهش اشاره کردین رو من نوشتم و به جواب نرسیدم

ببینین من میگم مثلا ما توی داس میزنیم regedit.exe /e ..... بعد از زدن اینتر! رجیستری اجرا میشه و اسکپورت میگیره ، همون طور در سورس هاتون اشاره کردین، حالا من صفحه داس رو با برنامه خودم میام باز میکنم و توش تایپ میکنم regedit.exe /e .... ! و ایتتر هم میزنم ولی اجرا نمیشه !!! داسی که توسط برنامه من باز شده اگه توش بزنین regedti.exe /e c:\aaa.txt "subkey" اکسپورت نمیگیره از رجیستری!!(سعی کردمشفاف مشکلو بیان کنم ) مشکل اصلی اینه ! برنامه هم ران از ادمین شده داس همران از ادمین توسط برنامه اجرا میشه !

کلا مث اینکه ویبی 6 از ویندوز های 64 بیتی خوشش نمییاد... آدم به تناقض میرسه :|

m.4.r.m
دوشنبه 24 تیر 1392, 03:14 صبح
اره خوب این مشکل عمده هست مثلا تو ویندوز 64 تابع Trim و Space واسه من کار نمیکنه حالا واسه شما هم این کار نمی کنه بالاخره باید یه کاریش کرد از کامپوننت های Registry استفاده کردی ؟

mehran901
دوشنبه 24 تیر 1392, 13:24 عصر
اره خوب این مشکل عمده هست مثلا تو ویندوز 64 تابع Trim و Space واسه من کار نمیکنه حالا واسه شما هم این کار نمی کنه بالاخره باید یه کاریش کرد از کامپوننت های Registry استفاده کردی ؟

سلام مجدد و تشکر فراوان ، درواقع من از api نتونستم به خوبی برای این کار استفاده کنم ، و از کامپوننت ها هم که استفاده کردم مشکل همین هست وقتی در رجیستری بخوام بنویسم در آدرس اصلی نوشته نمیشه مثلا من میخوام در اینتری ی برنامه دیگه مقدار ست کنم ولی برنامه من آدرس رو دیرکت میکنه رو آدرسی که بخشی به اسم wow6432node رو اضافه داره ... به همین منظور گفتم از رجیستری و شاخه مورد نظرم اکسپورت بگیرم تا اطلاعاتش رو بخونم که بازم نشد و در این فروم بحث رو باز کردم شخصی ی راهکار داده

(http://www.dreamincode.net/forums/topic/324810-running-the-32bit-compiled-app-on-64-bit-windows-with-registry-access/)

http://www.dreamincode.net/forums/topic/324810-running-the-32bit-compiled-app-on-64-bit-windows-with-registry-access/

البته این تاپیک رو دیشب زدم که به سرعت به نتیجه رسید ولی مشکل این هست که هنوز موفق نشدم ازش به خوبی استفاده کنم .... راهکاری دارین شما ؟

M.T.P
دوشنبه 24 تیر 1392, 13:40 عصر
کد زیر رو امتحان کنید:


Shell Environ$("comspec") & " /k regedit.exe /e c:\1223.reg " & _
Chr(34) & _
"HKEY_LOCAL_MACHINE\SOFTWARE" & _
Chr(34)


اگه نشد این تابع رو صدا بزنید:


Sub ExportSoftwares()
Dim strCmd As String
Dim strFile As String
Dim intFile As Integer

strFile = "c:\reg.bat"
intFile = FreeFile
Open strFile For Output As intFile
Print #intFile, "cmd.exe /k regedit.exe /e c:\1223.reg " & _
Chr(34) & _
"HKEY_LOCAL_MACHINE\SOFTWARE" & _
Chr(34)
Close intFile

Shell strFile, vbHide
End Sub

mehran901
دوشنبه 24 تیر 1392, 13:52 عصر
کد زیر رو امتحان کنید:


Shell Environ$("comspec") & " /k regedit.exe /e c:\1223.reg " & _
Chr(34) & _
"HKEY_LOCAL_MACHINE\SOFTWARE" & _
Chr(34)


اگه نشد این تابع رو صدا بزنید:


Sub ExportSoftwares()
Dim strCmd As String
Dim strFile As String
Dim intFile As Integer

strFile = "c:\reg.bat"
intFile = FreeFile
Open strFile For Output As intFile
Print #intFile, "cmd.exe /k regedit.exe /e c:\1223.reg " & _
Chr(34) & _
"HKEY_LOCAL_MACHINE\SOFTWARE" & _
Chr(34)
Close intFile

Shell strFile, vbHide
End Sub
فک کنم درست بشه ...حتما تست میکنم ولی دوستان دیگه هم راه حل های دیگه ای داشتند خوشحال میشم بیان کنند

M.T.P
دوشنبه 24 تیر 1392, 14:06 عصر
فک کنم درست بشه ...حتما تست میکنم ولی دوستان دیگه هم راه حل های دیگه ای داشتند خوشحال میشم بیان کنند

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

mehran901
دوشنبه 24 تیر 1392, 21:52 عصر
شما تست کنید ، جواب نگرفتید تا یه راه حل دیگه بزارم

سلام مجدد ، ی چیز جالب بگم ... تست کردم و هیچ کدومش جواب نداد!!! ی فایل بت ساختیم توش دستورو مینویسیم اجرا میکنیم ولی کار نمیکنه :قهقهه::عصبانی++: اصلا کلا داس توسط برنامه من باز بشه دستور توش قرار نیس اجرابشه انگار :| همش 4 تا کلیدو میخوام بخونم 4 تنا کلیدم بنویسم (همون بتچ فایل رو با دست بریم باز کنیم درست کار میکنه !!! هههه )
ویبی6 نسخه 64 بیتی هم داره ؟ یعنی برنامه رو با اون کامپایل میشه کرد که درست بشه یعنی! ذهنم کار نمیکنه دیگه :D

mehran901
دوشنبه 24 تیر 1392, 22:34 عصر
در این رابطه میشه کمک کنین کشفش کنیم ؟ :D

http://msdn.microsoft.com/en-us/library/windows/desktop/aa384129(v=vs.85).aspx

حرف دل منو زده دقیقا مشکلو گفته

miladatashin
دوشنبه 24 تیر 1392, 22:46 عصر
در این رابطه میشه کمک کنین کشفش کنیم ؟ :D

http://msdn.microsoft.com/en-us/library/windows/desktop/aa384129(v=vs.85).aspx

حرف دل منو زده دقیقا مشکلو گفته

جالبه من تا حالا به این مشکل روبرو نشدم. لطفا با همون روشی که چند پست قبل گفتم (Run this program in compatibility mode) این بار خود vb6 (و نه exe خودنتون )رو تو mod32 بیتی اجرا کنید و ببینید چی میشه؟

mehran901
سه شنبه 25 تیر 1392, 00:34 صبح
جالبه من تا حالا به این مشکل روبرو نشدم. لطفا با همون روشی که چند پست قبل گفتم (Run this program in compatibility mode) این بار خود vb6 (و نه exe خودنتون )رو تو mod32 بیتی اجرا کنید و ببینید چی میشه؟

حتما این رو هم تست میکنم البته توجه کنین ویندوز 8 64 بیتی هست ...

M.T.P
سه شنبه 25 تیر 1392, 12:56 عصر
به خاطر اینه cmd.exe دیگه توی system32 نیست و توی SysWOW64 قرار داره ، البته تو ویندوز 64 بیتی پوشه System32 هست اما در واقع یه Shortcut از Syswow64 هست.

من 64 ندارم ببینید این کد جواب میده:


Shell Environ$("windir") & "\SysWOW64\cmd.exe" & _
" /k regedit.exe /e c:\1223.reg " & _
Chr(34) & "HKEY_LOCAL_MACHINE\SOFTWARE" & Chr(34)

vbhamed
سه شنبه 25 تیر 1392, 13:15 عصر
سلام
تمام فايلها يعني cmd.exe و regedit.exe و فايل خروجي رو با مسير كامل بنويسيد ببينيد مشكل حل ميشه ؟

ضمنا يك مسئله ديگه :
چرا regedit.exe رو با cmd /k اجرا كردين، regedit كه يك فايل خارجي هست و دستور داخلي cmd نيست كه بخواد با /k اجرا بشه، cmd /k رو حذف كنيد و اين راه رو هم تست كنيد

آخرش هم اگر نشد يك برنامه كوچيك كار با رجيستري با دات نت به صورت 64 بيت بنويسيد و توسط پارامتر اون رو فراخواني كنيد تا داده هاتون رو در جاي درست رجيستري بنويسه !

meys34
سه شنبه 25 تیر 1392, 16:21 عصر
شما که همه چی رو امتحان کردی این هم روش... ایشالا جواب میده...





' Reads a REG_SZ value from the local computer's registry using WMI.
' Parameters:
' RootKey - The registry hive (see http://msdn.microsoft.com/en-us/library/aa390788(VS.85).aspx for a list of possible values).
' Key - The key that contains the desired value.
' Value - The value that you want to get.
' RegType - The registry bitness: 32 or 64.
'
Function ReadRegStr(RootKey, Key, Value, RegType)
Dim oCtx, oLocator, oReg, oInParams, oOutParams

Set oCtx = CreateObject("WbemScripting.SWbemNamedValueSet")
oCtx.Add "__ProviderArchitecture", RegType

Set oLocator = CreateObject("Wbemscripting.SWbemLocator")
Set oReg = oLocator.ConnectServer("", "root\default", "", "", , , , oCtx).Get("StdRegProv")

Set oInParams = oReg.Methods_("GetStringValue").InParameters
oInParams.hDefKey = RootKey
oInParams.sSubKeyName = Key
oInParams.sValueName = Value

Set oOutParams = oReg.ExecMethod_("GetStringValue", oInParams, , oCtx)

ReadRegStr = oOutParams.sValue
End Function


به عنوان مثال:


Const HKEY_LOCAL_MACHINE = &H80000002
sPath = ReadRegStr(HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\ASP.NET\2.0.50727.0", "Path", 64)
Print sPath

sPath = ReadRegStr(HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\ASP.NET\2.0.50727.0", "Path", 32)
Print sPath

AbbasVB
سه شنبه 25 تیر 1392, 17:09 عصر
درود

آخرش ما نفهمیدیم که مشکل کجاست:لبخندساده:
شما با بکاپ گرفتن مشکل دارید یا با اجرای برنامه از طریق cmd?
دوستان این همه کد گذاشتن اگه هیچ کدی درست کار نمی کنه حتما ویندوز شما مشکل داره چون برنامه ای که من گذاشتم از ریجستری در سیستم عامل 64 بیتی بک آپ می گیره!
من امتحان کردم

تا درودی دیگر بدرود

mehran901
سه شنبه 25 تیر 1392, 18:58 عصر
درود

آخرش ما نفهمیدیم که مشکل کجاست:لبخندساده:
شما با بکاپ گرفتن مشکل دارید یا با اجرای برنامه از طریق cmd?
دوستان این همه کد گذاشتن اگه هیچ کدی درست کار نمی کنه حتما ویندوز شما مشکل داره چون برنامه ای که من گذاشتم از ریجستری در سیستم عامل 64 بیتی بک آپ می گیره!
من امتحان کردم

تا درودی دیگر بدرود

سلام مرسی ، کدوم سورس آیا ؟:لبخند:
خوشحال میشم برنامتون رو ضمیمه کنین ... :)

درواقع من رو چندتا ویندوز تست کردم و همه همین مشکل رو داشتند البته فکر کنم با نظری که اخیرا یکی از دوستان دادند مشکل حل بشه

mehran901
سه شنبه 25 تیر 1392, 18:59 عصر
از همه تشکر میکنم چون خودم ویندوز 64 بیتی ندارم و باید رو سیستم دوستان تست کنم به زودی همه روش های مطرح شده رو تست میکنم نتیجش هم بیان میکنم تا بقیه استفاده کنند