WOW64 - running powershell from within Visual Studio - visual-studio-2010

Can someone please explain, simply, why it is necessary to go through so many hoops in order to run PowerShell (as an external command) from visual studio? I know it has to do with the bit differences but don't get why. The context is a 64 bit Windows 7 OS, 32 bit Visual Studio, and 32 bit powershell from the System32 folder if I remember correctly. A 64 bit OS can run both 32/64 applications without problems, so what is the issue here, and why?
By internet searching I believe this has something to do with WOW64, hence the tag, but I'm not really sure. I know the OS emulates the old 32 bit software but I don't see why VS can't run the command to start powershell without going through hoops, such as adding a '...Native...' folder (that acc. to our instructor doesn't actually exist) to the path.
Hope that isn't confusing.

Visual Studio is a 32-bit process, there is no 64-bit version. When you ask it to run something from c:\windows\system32, Windows will redirect the request to c:\windows\syswow64. The home of all 32-bit Windows executables.
Using %windir%\sysnative instead is the workaround, that gets redirected to c:\windows\system32.
The file system redirector is described here.

Related

Detect 32-bit install of program on a 64-bit system

VB.NET Winforms Program, .NET 4.0, compiled with VS2013. 100% managed code; no DLL that depend on a certain processor architecture.
I have two Visual Studio Installer projects, one for x86 and the other for x64.
The program "phones home" to find a new program; right now I detect the processor architecture to determine, if a new program exists, to download the 32-bit or 64 bit installers.
Detection code:
dim sArchitecture as String = ""
If Environment.Is64BitProcess Then
sArchitecture = "x64"
Else
sArchitecture = "x86"
End If
Problem scenario:
Customer has 64 bit machine but downloads 32 bit installer, which of course works properly. In fact, we advise customers who do not know their processor architecture to download the 32 bit installer.
32-bit installer program phones home and sends the x64 processor architecture it detects in the program. Download brings in 64-bit installer, which installs a second copy of the program into the customer's computer and confusion ensues.
What I need to figure out, if I use a Visual Studio installer project, with a TargetPlatform set to x86, is there some reliable way to detect this? Checking the install folder to see if it contains "Program Files (x86)" is insufficient; the customer may have installed the program to another location.
I would truly appreciate the Help!
Thanks
John.
Switch to the Release build and right-click your EXE project > Properties > Build tab. You have the Platform target set to AnyCPU and the Prefer 32-bit checkbox turned off.
Yes, very convenient that .NET program can automatically run in 32-bit and 64-bit mode. You don't need separate builds for the 32-bit and the 64-bit version, nice. Other than that your "detection code" no longer works reliably, the 32-bit installer still deploys a program that runs in 64-bit mode. The only way to discover what installer was used if it does not leave a bread crumb is to reverse-engineer it from the install directory. Yes, not very reliable. Leaving a bread crumb in the registry is otherwise very easy to do, installers are good at writing registry keys.
But just simplify your life, you just don't need a 64-bit specific installer at all. One gets the job done. That it is stored in the "wrong" directory just doesn't matter, you already know it works fine.

Windows Installer ability to place short-cut with different URIs

I have a windows form application which is being installed on client pc by using msi file trough active directories, application is a 32bit app which is being deployed to a 32 bit and 64 bit windows systems and as we know application folder names are different between 32 and 64 bit systems, Program Files and Program Files(x86), also during installation application shortcut is placed in startup folder so app will be started when PC us powered up.
Question: Is there a chance to build msi by Windows Installer provided by Visual Studion in such a way that it will check what operating system its being installed at and place the shortcut in to start up folder with correct URI, to Program Files\Applicaiton\ or Program Files(x86)\Applicaiton?
Thank you!
Windows Installer packages are platform aware (x86, x64 ). Windows Installer doesn't support 64bit packages running on 32bit platforms or 32bit packages writing to 64bit ProgramFiles.
You can compile your EXE as AnyCPU and even though it's installed as 32bit it'll execute as 64bit. Although the Visual Studio team has moved away from that and compile as x86 by default in recent versions of Visual Studio.
Upon initialization, the Windows Installer gathers information about the operating system and automatically sets properties that can be used in optional conditional statements used by the setup application, such as VersionNT64 and "System Folder Properties"
In cases where it is necessary for the setup to know this information, it is preferred practice to allow the Windows Installer service to determine folder locations rather than try to hard-code this information into the package.

vb 6.0 program on windows 7

I have been trying to install and run a program written in vb 6.0 on windows 7. It was working fine installing and running in windows xp. The error message after installing and running it say that
Run-time error 339" : Component voice.ocx or one of its dependencies not correctly registered: a file is missing or invalid.
This program has voice recording things.
I manually register that ocx component but still error that shown like
The module "voice.ocx" failed to load.
And I try to install VB run-time and still shows the same error. I believe that Windows 7 support vb 6.0 programs.
One thing here I am not sure of is that the ocx component I have is whether 16 or 32 bit version. I don't think we cannot register 16 bit version ocx in windows 7.
And I also try to install and run in compatibility mode or even as administrator. I think it is a platform related issue? And it might be some other work-around. So, I appreciate your hints or clues on this program runnable in windows 7.
Thanks in advance.
Regards,
SEE
Just encase anyone else sees this.. here is what I did
I knew the program was running on Windows XP, with visual basic installed. I had only been given the exe and the MDB. So I created a virtual machine (stick with me) of Windows XP, installed visual basic and test the app. It was fine. Then I downloaded a dependency tool called Dependency Walker from http://www.dependencywalker.com/. I installed this in the virtual machine and asked it to open my exe.
Once this was loaded I ignored the warnings and asked it to start profiling. I ran the app, stepped through everything I could see, then exited the application. This left me with a log of the DLLs that had been accessed. Slowly I went through these checking if they existed on my windows 7 setup, when one was missing I copied it to my application directory and then from an elevated command prompt run "regsrv32 [missing_name.dll]" until there were no files which my windows 7 desktop didn't have.
the application then worked fine! This may not work all the time, because of the way third party OCX's or DLLs have been written. But it may help someone out.
Few of old Win32 components are not supported in Windows 7. There are possibilities of failure of a VB Program in Windows 7.
But there are some possible ways to fix those.
Check the following links to avail the same.
http://www.personalcomputerfixes.com/general-errors/how-to-successfully-fix-the-339-runtime-error/
http://social.msdn.microsoft.com/Forums/en-US/vbpowerpacks/thread/8cb5ab97-8407-4e49-8db6-30dcef87cbd1/
http://yang.articlesbase.com/operating-systems-articles/simple-solutions-on-how-to-fix-runtime-error-339-1830111.html
I have developed several programs with VB5 on a WinXP32 machines and then installed them on Windows 7 (32 and 64) PCs without problems.
This applications use different OCXs (16 and 32 bit version) and till now I never get problem with them. Thus I do not think that the VB5 or Vb6 could have any issue on Windows 7 machines.
On the other hand I would point out the module "voice.ocx" and investigate if it can run on a windows 7 pc, because as Katturaja sais some old ocx have problem on win7. To do that, I would create a simply VB6 project that uses voice.ocx (just an Hallo-World"), then create the installation pack and finally try to install on a clean win7 machine (for example a virtual machine). In this way you could isolate the problem.
I hope this could help you.

App created in Visual Studio on XP 32 crashes 64 on access violation. Recompile in 64 bit environment to find bug, works fine. What?

So I've been developing on Windows XP Visual Studio 2008. I guess it is building my C++ app in 32 bit mode. When I run the program on my new Windows 7 64 bit box, it gets half way through loading a then throws an access violation error. So, I loaded all my development tool and recompiled the project on Windows 7 to find the crash site but it works perfectly! What? How do I make my app work on x64? Do I have to release two seperate versions? I know I can target 64 bit but I don't like two separate executables. I've searched but keep getting the two version solution or everything .net. This is a native C++. is there an x86 flag somewhere?
"Do I have to release two seperate versions?"
It depends on what your app does. The majority of 32bit apps work just fine in WoW mode.
"is there an x86 flag somewhere?"
Yup. Open up the configuration manager (Alt-B, O) and you will likely see a win32 in the platform selection.
Why your app crashes is going to take some debugging. You should be able to attach the debugger to the 32bit version on the 64bit OS.
Have you considered the possibility that you may be trashing memory? From the way that the application happens to be loaded into memory, it may be that the 32-bit app on 32-bit Windows and the 64-bit app on 64-bit Windows "get lucky", i.e. no important memory locations are overwritten, whereas the 32-bit app on 64-bit Windows is less lucky and crashes.
To find out if you are indeed trashing memory, you can use tools such as Purify and Valgrind.
As the others' answers already said, it is very likely that the application has bugs that are being hidden in one environment. A good tool that has a low cost of entry in terms of learning curve is Microsoft's application verifier. That along with the debugging tools can provide a very good start. Take a look at the gflags utility.

Missing Visual Studio features when running in 64-bit mode

Can someone tell me why I don't have all of the dev studio windows available to me when I develop on a 64-bit platform? I upgraded my dev desktop box to server 2003 x64 to match our deployment platform. Since then (I'm using VS2005) I've noticed that several windows aren't available. I can't view Processes (which is the most annoying) so I don't know which processes I'm attached to. I can attach to a process fine, but it won't show me what is already running under the debugger. There are others, but that's the one that sticks out in my mind at the moment.
My question is where are these limitations of developing under 64 bit documented (assuming they are)? (Of course, I also get the "Edit/Continue" warning dialog all the time telling me that doesn't work in 64-bit)
Also, is VS2008 any better under 64 bit?
Follow-up: Apparently my question is a little bit vague. I'm developing a 64-bit app on a 64-bit development environment. "Recompile it in x86" doesn't solve my problems.
Follow-up #2: I'm giving it one more shot. I WANT TO DEBUG A 64 BIT PROGRAM ON A 64 BIT ENVIRONMENT AND I DON'T HAVE ALL OF THE VISUAL STUDIO FEATURES SHOWING UP. HOW DO I GET THEM?
Follow-up #3: I just installed XP 64 (previously I was using Server 2003 64-bit) and those features all showed up again (Process window, etc). Apparently the server version of windows doesn't provide all of the dev features.
Can anyone tell me why?
"Edit/Continue" can work if you change the build setting to X86 :)
Here was the suggestion from StackOverflow about it.
I had some problem with NUNIT when debugging code. The solution was to use the special program in the \bin\ folder Nunit-x86.exe for old code built in x86 and use the Nunit.exe for x64 built.

Resources