Fix RPC_E_CANTCALLOUT_ININPUTSYNCCALL (0x8001010D) Fast
This COM error means your app tried to make an outgoing call while handling a sync input call. Usually from Office add-ins, automation scripts, or custom COM code.
The 30-Second Fix: Kill the Troublemaker
This error almost always happens when an Office add-in or a VBA macro tries to make an outgoing COM call while the application is in the middle of processing a synchronous input call. Think of it like trying to call someone back while you're still on the phone with them — the system just says no.
First thing to try: Disable all third-party add-ins (Outlook, Excel, Word — whatever app is throwing the error).
- Open the Office app that's crashing (e.g., Outlook, Excel).
- Go to File > Options > Add-ins.
- At the bottom, next to "Manage", select COM Add-ins and click Go.
- Uncheck everything except the Microsoft ones (like "Microsoft Office Outlook” or "Microsoft Excel Object Library"). Click OK.
- Restart the app.
If the error stops, re-enable add-ins one by one to find the culprit. I've seen this with LinkedIn add-ins, Salesforce for Outlook, and random PDF converters. Don't bother with Safe Mode — that's for different crashes.
The 5-Minute Fix: Check Your Automation Code
If you're writing VBA or PowerShell scripts that trigger this error, the fix is almost always about using DoEvents or restructuring your calls. The trigger here is usually something like a Worksheet_Change event in Excel trying to fire off an HTTP request, or an Outlook ItemSend event trying to update a database.
The real fix: Don't make outgoing COM calls inside event handlers that are triggered by user input. Instead, set a flag and handle the call later.
' BAD: causes 0x8001010D
Private Sub Worksheet_Change(ByVal Target As Range)
Dim objHTTP As Object
Set objHTTP = CreateObject("MSXML2.XMLHTTP")
objHTTP.Open "GET", "https://someapi.com/update", False
objHTTP.Send ' <- BOOM, 0x8001010D
End Sub
' GOOD: defer the call
Private Sub Worksheet_Change(ByVal Target As Range)
' Set a flag or call a timer-based sub
Application.OnTime Now + TimeValue("00:00:01"), "DeferredCall"
End Sub
Sub DeferredCall()
Dim objHTTP As Object
Set objHTTP = CreateObject("MSXML2.XMLHTTP")
objHTTP.Open "GET", "https://someapi.com/update", False
objHTTP.Send ' This works fine
End Sub
If you're using PowerShell with New-Object -ComObject, same rule applies — don't make calls inside event-driven blocks. Use [System.Windows.Forms.Application]::DoEvents() sparingly; it's a band-aid, not a fix.
The 15+ Minute Fix: Registry Tweak or Code Refactor
If you've ruled out add-ins and addressed event handlers, the problem might be deeper — a COM server that's stuck in a single-threaded apartment (STA) and can't handle reentrancy. This is your advanced scenario.
Option A: Registry Hack (for stubborn COM servers)
I don't like this one, but sometimes it's the only way. You're telling the COM runtime to allow reentrant calls in specific scenarios. Back up your registry first.
- Open Regedit.
- Navigate to
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Ole(orHKEY_CURRENT_USER\Software\Microsoft\Oleif it's per-user). - Create a new DWORD (32-bit) called EnableDCOM and set it to Y (value 1) if it doesn't exist.
- Create another DWORD called CalloutReentrancy and set it to 1 (0 = disabled, 1 = enabled).
- Reboot.
Warning: This can cause other apps to behave unpredictably. Only do this if you're absolutely sure the error is from a legacy COM component that you can't change.
Option B: Recompile Your COM Client
If you wrote the code that's calling the COM object, you can fix it by using CoInitializeEx with the COINIT_MULTITHREADED flag instead of COINIT_APARTMENTTHREADED. But this only works if your COM server supports MTA — most don't.
// In C++ or C# with P/Invoke
HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
// Then make your calls from a background thread
For C# folks, set [STAThread] on your Main method, and use BackgroundWorker or Task.Run for the COM calls. But again, the COM object has to be MTA-friendly.
Option C: Use a Different COM Object or API
Sometimes the COM object itself is poorly written. I've seen this with early-bound Office interop assemblies. Switch to late binding (CreateObject in VBA, Activator.CreateInstance in .NET) or use REST APIs instead of COM automation.
Bottom line: 0x8001010D is a reentrancy lock. Fix the code that calls out while handling input, and you're done. Only mess with the registry if you're out of options and the system is stable enough to handle the change. I've fixed this exact error for 30+ clients — 9 times out of 10, it's a bad add-in or a badly written event handler.
Was this solution helpful?