Brantley
  • Brantley
  • 53.6% (Neutral)
  • Nestling Topic Starter
2011-04-27T11:32:15Z
I've been using RDTabs for some time, and I must say: Thanks! It's a wonderful utility.

I've just recently started using a new computer and am having some warnings when I connect to a server:
UserPostedImage

If I dismiss that, another, identical, dialog pops up. If I keep dismissing (4 times in all), it will eventually successfully connect and everything works just fine.

RDTabs:
RD Tabs 64 v2.1.24

My desktop:
Windows 7 Enterprise 64bit, SP1

I have gotten this connecting to both Windows 2008 R2 servers and Windows 7 desktops. I don't have convenient access to any other remote OS's, so I haven't really tried on anything other than those two.
Timothy
  • Timothy
  • 100% (Exalted)
  • Flock Leader
2011-04-27T19:01:09Z
COMCTL32.dll is a core component of WinForms (most standard Windows Applications). I don't know what ordinal 345 is, but if you google it, you'll see that it's not a unique problem to RD Tabs. It seems there could be many causes. I would start with a sfc /scannow to make sure none of the core DLLs are corrupted. Make sure Windows is up-to-date on patches and you have rebooted after applying them. You may also want to run the regtsax.exe in the RD Tabs folder from an elevated command prompt, and then reboot. Use the argument "reigster" as such:
C:\Program Files\Avian Waves\RD Tabs> regtsax register

Another question: have you used any registry cleaner tools or aggressive spyware / privacy cleaning tools?
Brantley
  • Brantley
  • 53.6% (Neutral)
  • Nestling Topic Starter
2011-04-28T09:11:51Z
Tim,

Thanks for replying back.

I have done the "sfc /scannow" (which did find and correct issues), and have registered the terminal services activex control (and rebooted). I still am having the issue.

I have not run any registry cleaning tools. The anti-spyware is vanilla Trend Micro. Nothing too crazy.
Timothy
  • Timothy
  • 100% (Exalted)
  • Flock Leader
2011-04-28T23:03:27Z
Unfortunately, I don't know what else to try. Maybe reinstalling the .Net Framework? RD Tabs uses .Net 2.0, which is the same CLR for 2.0, 3.0, and 3.5, so reinstalling any of those three would be reinstalling the framework for RD Tabs. .Net 4.0 is a brand new CLR, so reinstalling that should have no effect.

You might also want to try the 32-bit version of RD Tabs. The functionality is identical. The only advantage of the x64 version is just that it uses the x64 remote desktop libraries (and .net libraries, too), but for remote desktop there really shouldn't be a noticable difference between the two.

If you ever discover the cause, I would be very interested in hearing the cause and resolution.
Brantley
  • Brantley
  • 53.6% (Neutral)
  • Nestling Topic Starter
2011-04-29T07:58:20Z
Understood. I just tried the 32 bit version by the way. Same issue.

If you're willing to try it, I'm willing to build/debug from source, or step through with debug symbols (if you can give me a build that throws an unhandled exception at that point).
Timothy
  • Timothy
  • 100% (Exalted)
  • Flock Leader
2011-05-03T00:35:39Z
Good idea. Contact me through the Contact link at the top of the page. Then we can email details about this.
Brantley
  • Brantley
  • 53.6% (Neutral)
  • Nestling Topic Starter
2011-05-18T16:34:04Z
Tim,

I have a little new information.

1. I do not have this issue unless the "Enable Network Level Authentication" checkbox is checked under "Advanced" on the connection properties dialog. Uncheck it and I can log into a computer just fine. Check it and I get the warning every time.


2. I found the change log for this app: http://classicshell.sourceforge.net/history.html . One of the revisions (v1.9.8) was to fix this exact issue. I got the source and looked through it to find out what had changed to fix the problem. Here it is:

Original code (starting at line 315 in Settings.cpp):

			{
				TASKDIALOGCONFIG task={sizeof(task),hwndDlg,NULL,TDF_ALLOW_DIALOG_CANCELLATION,TDCBF_OK_BUTTON};
				task.pszMainIcon=TD_INFORMATION_ICON;
				task.pszWindowTitle=L"Classic Explorer";
				task.pszMainInstruction=L"After modifying the ini file you have to open a new Explorer window to use the new settings.\n\nRemember: All lines starting with a semicolon are ignored. Remove the semicolon from the settings you want to use.";
				task.pszVerificationText=L"Don't show this message again";
				BOOL bIgnore=FALSE;
				TaskDialogIndirect(&task,NULL,NULL,&bIgnore);
				if (bIgnore)
					regSettings.SetDWORDValue(L"IgnoreIniWarning",1);
			}


Patched code (again, starting at line 315 in Settings.cpp):

			{
				TASKDIALOGCONFIG task={sizeof(task),hwndDlg,NULL,TDF_ALLOW_DIALOG_CANCELLATION,TDCBF_OK_BUTTON};
				task.pszMainIcon=TD_INFORMATION_ICON;
				task.pszWindowTitle=L"Classic Explorer";
				task.pszMainInstruction=L"After modifying the ini file you have to open a new Explorer window to use the new settings.\n\nRemember: All lines starting with a semicolon are ignored. Remove the semicolon from the settings you want to use.";
				task.pszVerificationText=L"Don't show this message again";
				BOOL bIgnore=FALSE;
				// call TaskDialogIndirect indirectly because we don't want our DLL to depend on that function. the DLL is loaded even in processes
				// that use the older comctl32.dll, and that dependency causes an error
typedef HRESULT (__stdcall *FTaskDialogIndirect)(const TASKDIALOGCONFIG *pTaskConfig, __out_opt int *pnButton, __out_opt int *pnRadioButton, __out_opt BOOL *pfVerificationFlagChecked);
				FTaskDialogIndirect pTaskDialogIndirect=(FTaskDialogIndirect)GetProcAddress(GetModuleHandle(L"comctl32.dll"),"TaskDialogIndirect");
				if (pTaskDialogIndirect)
				{
					pTaskDialogIndirect(&task,NULL,NULL,&bIgnore);
					if (bIgnore)
						regSettings.SetDWORDValue(L"IgnoreIniWarning",1);
				}
			}



Now granted, this is CPP and your code is managed (c# presumably), but I wonder if there's something to how that "TaskDialogIndirect" class is called. Does your code do that? I do see the credentials dialog painting slowly with each warning that I dismiss.

Just pure guesswork on my part, but thought I would pass it along.
Timothy
  • Timothy
  • 100% (Exalted)
  • Flock Leader
2011-07-03T14:25:28Z
Sorry for taking so long to reply to this subject. I tried enabling NLA on my end, but I still don't get the error (W7 64bit, Ultimate). The CPP code you posted is, as you suspected, not applicable to RD Tabs. Dialog creation is mostly hidden from the user in .Net as the .Net libraries do the lifting while you interface just with the wrappers. Instantiation of the RDP object, though, is a bit more direct as there is no .Net wrapper for it, so I had to create my own with the COM interop tools with .Net. The problem is that the COMCTL32 stuff is most likely inside the RDP control. That's a black box to RD Tabs as it's just a DLL provided by Microsoft.

Based on the Stack Overflow link you provided, it seems to clearly indicate that the COMCTL32.DLL is different between the computers that work and those that do not. So my guess is maybe some third party program overwrote COMCTL32.DLL with an older version which is bad mojo as that's the whole reason behind the WinSxS folder. I will email you my copy so you can compare. Maybe that will work.
Brantley
  • Brantley
  • 53.6% (Neutral)
  • Nestling Topic Starter
2011-07-05T08:37:38Z
Timothy,

I should have replied back a while ago. I'm nearly positive that I've found the issue. I'm using a biometric fingerprint reader from digitalPersona. I believe that it swaps out a few system libraries with its own version, so it can hook in to login dialogs.

The "ordinal 345" issue also occurs using Terminals, and I seem to recall seeing it on some other similar application as well.

What I can't explain is why it only occurs with the ActiveX RDP client, and even then only when it's attempting an NLA connection.

So, your guess that something is swapping out the lib is likely correct.

Thanks for all your help!
Timothy
  • Timothy
  • 100% (Exalted)
  • Flock Leader
2011-07-05T09:16:58Z
full film