A Developer's Strange Love, or: How I Learned to Stop Worrying and Love Windows
· Go Komura · Windows, Windows Development, Backward Compatibility, COM, ActiveX, QA, Philosophy
1. The Conclusion First
When you build Windows apps, there is a lot to worry about.
Will it launch on this PC? Will it work in environments without administrator privileges? Will the 32-bit / 64-bit difference break it? Japanese paths, long paths, network drives, old DLLs, COM components, ActiveX, printers, serial communication, antivirus software, Windows Update.
Once you start thinking about it, the worries never end.
But at some point, I began to think differently.
Maybe this is not a flaw, but evidence that Windows has carried real-world business on its back.
Windows is not a pristine utopia. But it has absorbed the software, the equipment, the business workflows, and the human habits that have kept running in the field for decades.
That chaos is exactly what makes Windows interesting, and what makes it worth engaging with as a developer.
2. Windows App Development Comes with Many Worries
In Windows app development, “the code is correct” is not enough.
It works in the local environment. It works on the developer’s PC. It works in the test VM, too.
Even so, there is no guarantee it will work on the customer’s PC.
For example, things like this happen:
- A DLL cannot be found
- The Visual C++ runtime is not installed
- The .NET Framework version does not match
- Loading a 32-bit DLL from a 64-bit process fails
- The COM registration is broken
- The 32-bit and 64-bit versions of
regsvr32.exeget mixed up - Code that assumes the current directory breaks under Task Scheduler
- Writing under
Program Filestriggers a permissions error AppData\RoamingandAppData\Localget used the wrong way around- It crashes on Japanese user names or Japanese folder names
- Files cannot be opened on long paths
- It works on a mapped network drive but not on a UNC path
- The UI breaks in high-DPI environments
- Coordinate calculations drift across multiple monitors
- Print output differs depending on the printer driver
- USB devices, cameras, measuring instruments, and serial communication go unrecognized depending on the environment
- Antivirus software blocks part of the processing
- Behavior changes after a Windows Update
Lined up like this, it is a little dizzying.
Problems that a web app can confine between the browser and the server spread across the entire PC in a Windows app. The file system, the registry, user profiles, printers, devices, the network, security policies, installers, runtimes.
The application is less “running on top of the OS” than placed inside a working business environment.
That is why Windows app development is hard. But I think dismissing it as “Windows is just bad” misses the point.
What rides on top of it is the complexity of the real world.
3. Windows Is the OS of the Field
Windows is not an OS that exists only for the latest technology.
Factories, hospitals, government offices, schools, laboratories, broadcasting, inspection equipment, reception terminals, report-printing terminals, warehouses, retail stores, accounting, payroll, inventory management. In places like these, vast numbers of Windows PCs are still running today.
And what runs there is not just the latest web services.
There are Excel macros. There is Access. There are old VB apps. There are .NET Framework business apps. There are resident apps written in C++. There are COM components. There is ActiveX. There are ODBC connections. There are printer drivers. There are barcode readers. There are measuring instruments on serial connections. There are vendor-supplied SDKs.
What’s more, none of these exist in isolation.
People operate them, print reports, swap USB devices, drop CSVs into shared folders; nightly batches run, and the next morning’s work begins. They run inside that whole chain of activity.
Windows is not merely a substrate for launching apps. It is a platform that absorbs the field’s daily work, its existing assets, its peripherals, and even its people’s habits.
That is why it sometimes looks old. Sometimes it is complicated. Sometimes you wonder why on earth a certain thing still remains.
But that also means it has never carelessly thrown the old things away.
4. Backward Compatibility as a Form of Love
If all you wanted was to make an OS look beautiful, cutting away the old mechanisms would be easier.
Delete the old APIs. Delete the old runtimes. Delete the old settings screens. Treat old apps as things that simply don’t run.
Do that, and perhaps the design becomes cleaner. Perhaps the documentation gets shorter. Perhaps developers feel a little lighter.
But behind that, there are business apps that stop working. There is equipment that grinds to a halt. There are work sites left in trouble.
Windows’s backward compatibility is technically a nuisance.
There is WOW64, for running 32-bit apps on 64-bit Windows.
The registry and DLLs can appear differently to 32-bit and 64-bit code.
There is the structure — confusing on first encounter — where C:\Windows\System32 is the 64-bit side and C:\Windows\SysWOW64 is the 32-bit side.
COM is a nuisance too. Dropping a DLL in place is not enough; registration may be required. Is the registration per user or per machine? Is it 32-bit COM or 64-bit COM? Are administrator privileges required?
.NET Framework is the same.
Today there is the option of using modern .NET, like .NET 8 / .NET 9.
But in the field, .NET Framework 4.x apps are still out there.
That is not mere oldness — it means that version has supported real business for many years.
Backward compatibility is not a concept that is merely beautiful. It is, rather, a heavy responsibility.
Keeping old things running means carrying technical debt. But at the same time, it is a form of integrity: not stopping the users’ business.
I believe this is where Windows is most lovable.
5. Windows Is an OS of Geological Strata
In Windows, the technologies of each era are stacked like geological strata.
Win32. COM. ActiveX. Windows Forms. WPF. .NET Framework. UWP. WinUI. Windows App SDK. MSIX. PowerShell. Windows Terminal. WSL.
Each had its era of arrival, its strengths, and the work sites where it has been used.
If you look only at the new, the old may look like clutter. But in Windows app development, there are many situations where you cannot ignore the older strata.
For example, even when building a WPF app, printing can bring you into contact with GDI and printer driver issues. Even writing C#, if a vendor SDK is a native DLL, you touch P/Invoke and bitness issues. Even when building new screens, you may need to keep existing COM components or Excel integration.
Windows is not a perfectly manicured garden. It is closer to a vast city that has been extended and rebuilt again and again.
There are main boulevards. There are underground passages. There are old back alleys. There are new high-rises.
It is easy to get lost. But deep in those alleys, important business is still running today.
What a developer needs is not the judgment that “old means unnecessary.” It is discerning which stratum of technology supports which business.
6. Turning the Hassle into Design
The title says “to stop worrying.”
But to stop worrying does not mean getting sloppy. Nor does it mean pretending not to see the problems.
To stop worrying is to turn the worry into design.
For example, if you are anxious about whether it launches, turn the launch check into a smoke test.
Start-Process .\MyApp.exe
And don’t just launch it — also try it with no configuration file, no log folder, standard user privileges, no network connection, no printer configured, high DPI, long paths, and Japanese paths.
If DLLs make you anxious, verify the dependencies. If the Visual C++ runtime is required, decide whether to bundle it in the installer or to state it explicitly as a prerequisite. If you use native DLLs, don’t leave the x86 / x64 / AnyCPU relationships vague.
If COM makes you anxious, write the registration steps into a runbook and reproduce them from scratch on a test PC.
# Example: registering a 64bit COM DLL
C:\Windows\System32\regsvr32.exe .\SomeComponent64.dll
# Example: registering a 32bit COM DLL
C:\Windows\SysWOW64\regsvr32.exe .\SomeComponent32.dll
If permissions make you anxious, avoid designs that only work with administrator privileges.
Put per-user settings in AppData and machine-wide settings in ProgramData.
Avoid designs that write logs under Program Files.
If paths make you anxious, include Japanese characters, spaces, long folder names, and UNC paths in your tests.
New-Item -ItemType Directory -Path "C:\テスト 用\とても長いフォルダー名\さらに深いフォルダー" -Force
If DPI makes you anxious, check at 100%, 125%, 150%, and 200%. With multiple monitors, check that nothing falls apart when crossing displays with different scaling factors. WinForms, WPF, and WinUI each approach DPI awareness differently, so verify per UI technology.
If memory and handles make you anxious, use Application Verifier, WinDbg, ProcDump, Process Explorer, and the like. If crashes make you anxious, keep event logs, dumps, and application logs.
Get-EventLog -LogName Application -Newest 20
Or, in newer environments, check the event log like this:
Get-WinEvent -LogName Application -MaxEvents 20
If you are anxious about defects that won’t reproduce in the field, raise the granularity of your logging. “An error occurred” is not enough. Which file was it trying to open? Which device was it looking for? Which user was it running as? Which path was it trying to write to? Which DLL could it not load?
Turn the worry into something observable.
In Windows app development, this is enormously important.
7. “It Works on the Customer’s PC” Is the Final Goal
Working in the development environment matters. Tests passing in CI matters. Working on a clean VM matters.
But for a Windows app, the final obstacle is always “does it work on the customer’s PC?”
That PC already has things installed. There may be an old printer driver. There may be a proprietary security product. Network drives may be mapped. The user may not have administrator privileges. There may be reasons Windows Update cannot be applied right away. It may be an environment with no internet access.
That is why the distribution method matters too.
Is handing over an exe enough? Should it be an MSI? ClickOnce? MSIX? Can it be distributed via winget? Will it go onto an internal distribution system? Is an offline installer needed? Is code signing required? Will SmartScreen or antivirus software block it?
Only when you include not just the app itself but installation, updates, uninstallation, log collection, and recovery procedures do you get close to “usable in the field.”
In Windows app development, software is not finished at delivery. It needs to launch in the customer’s environment, today and tomorrow.
8. Why I Love Windows Anyway
Windows has its hassles. That is a fact.
DLLs. COM. The registry. UAC. DPI. Printers. Runtimes. 32-bit / 64-bit. Network drives. Long paths. Japanese-language environments. Security software. Windows Update.
List the hassles and they never stop coming.
But much of that hassle comes from the fact that Windows has carried real-world business for a very long time.
It does not discard the old assets, yet it absorbs new technology too; it has a GUI and a CLI; it embraces local apps and the web, peripherals and business terminals, personal PCs and corporate PCs alike.
That is not a beautiful, unified philosophy.
But it is strong.
And as a developer, it is worth taking on.
Building software that runs reliably on Windows is not merely a matter of calling APIs. It means reading the constraints of the field, understanding the existing assets, finding the fragile spots, testing, observing, and fixing what needs fixing.
It is unglamorous. But it has value.
9. Conclusion
In Windows app development, the worries never run out.
But many of those worries are the result of Windows, as an OS, having absorbed real business, real work sites, real equipment, and real human operation over a very long time.
That is why I do not think of Windows as merely an old OS.
It is a huge, complex, slightly clumsy platform that has kept running while coming to terms with reality.
And building software that runs reliably on top of it still carries great value today.
Stop worrying.
But that does not mean letting your guard down.
Turn the worry into design, testing, and observation.
That is how, little by little, I came to love Windows.
Reference Links
- Application Verifier - Overview - Microsoft Learn
- High DPI Desktop Application Development on Windows - Microsoft Learn
- Setting the default DPI awareness for a process - Microsoft Learn
- Running 32-bit Applications - Microsoft Learn
- Maximum Path Length Limitation - Microsoft Learn
- MSIX documentation - Microsoft Learn
- Version compatibility in .NET Framework - Microsoft Learn
Related Articles
Recent articles sharing the same tags. Deepen your understanding with closely related topics.
Windows App Outsourcing and Contract Development: What to Sort Out Before You Ask
Before commissioning Windows app outsourcing or contract development, here is how to sort out existing software modification, device inte...
Why ActiveX Stops Working in Office 2024/Microsoft 365 and How to Diagnose It
When ActiveX stops working in Office 2024/Microsoft 365, work through the causes in order: default disablement, 32-bit/64-bit mismatch, C...
Registration and Bitness Pitfalls in COM/OCX/ActiveX Development
A practical look at the pitfalls of COM, OCX, and ActiveX development: 32bit/64bit, Visual Studio 2022, regsvr32/Regasm, administrator ri...
What Are COM / ActiveX / OCX? - The Differences and Relationships Explained
A practical guide to what COM is, what ActiveX is, and what OCX is - covering their differences and relationships, the connection to OLE,...
How to Handle ActiveX / OCX Today - A Keep / Wrap / Replace Decision Table
When you find ActiveX / OCX, how to choose between keeping, wrapping, and replacing it, covering 32-bit / 64-bit, registration, browser d...
Related Topics
These topic pages place the article in a broader service and decision context.
Windows Technical Topics
Topic hub for KomuraSoft LLC's Windows development, investigation, and legacy-asset articles.
ActiveX Migration
Topic page for staged decisions around keeping, wrapping, or replacing COM / ActiveX / OCX assets.
Where This Topic Connects
This article connects naturally to the following service pages.
Windows App Development
We support Windows desktop applications that involve resident processing, device integration, operational logging, and maintainable structure.
Legacy Asset Reuse & Migration Support
We help plan staged migration while continuing to reuse COM / ActiveX / OCX assets, native code, and 32-bit dependencies.
Author Profile
Profile page for the article author.
Go Komura
Representative of KomuraSoft LLC
Focused on Windows software development, technical consulting, and investigations into failures that are difficult to reproduce.
Public links