views:

399

answers:

1

Hi all,

I've recently had a customer report an issue with my applications and NVidia nView desktop manager. Basically nView seems to 'unhide' hidden secondary forms when moving an application between monitors. I'm testing with Delphi 2010. The problem can also be seen using just the IDE (show a non-docked window, close it and then choose to send the Delphi IDE to a different monitor.) The previously hidden forms are in an unresponsive state and can't be closed.

To reproduce:

. Use a multi-monitor system with NVidia nView desktop manager.
. Start any Delphi application with secondary forms that will be hidden when they are closed.
. Show or ShowModal the form, then close it (form needs to have been shown at least once).
. Choose to send the application to a different monitor. (via hotkeys or the caption icons)
. The application will move to the other monitor and any hidden forms will be visible.

Has anyone else seen this issue? I've verified it with an older version of nView, but a customer with the latest version has the issue whenever he tries to move the main form or resize it. Unfortunately my laptop can't be updated to the latest version so I can't easily test with it.

Thanks for any comments or suggestions!

-Mark

+1  A: 

I had the same problem. The Delphi application stopped responding without any obvious reason. Looking at the stack trace from madExcept I could see that the application froze in nview.dll. The only "solution" that I found was to look for nView and advise the user to turn it off using the code below:

function CheckForNview: Boolean;

  function IsNviewModuleRunning(AHandle: THandle; AProcessId: DWord): Boolean;
  var
    AModuleEntry: TModuleEntry32;
  begin
    AModuleEntry.dwSize := SizeOf(AModuleEntry);
    AModuleEntry.th32ProcessID := AProcessId;
    Result := False;

    if Module32First(AHandle, AModuleEntry) then
    begin
      if SameStr(AModuleEntry.szModule, 'nview.dll') then
        Result := True;
      while Module32Next(AHandle, AModuleEntry) do
      begin
        if SameStr(AModuleEntry.szModule, 'nview.dll') then
          Result := True;
      end;
    end;
  end;

var
  AHandle: THandle;
  AProcessEntry: TProcessEntry32;
begin
  Result := False;
  AHandle := CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
  if Process32First(AHandle, AProcessEntry) then
  begin
    if SameStr(AProcessEntry.szExeFile, ExtractFileName(ParamStr(0))) then
      Result := Result or IsNviewModuleRunning(AHandle, AProcessEntry.th32ProcessID);
    while Process32Next(AHandle, AProcessEntry) do
    begin
      if SameStr(AProcessEntry.szExeFile, ExtractFileName(ParamStr(0))) then
        Result := Result or IsNviewModuleRunning(AHandle, AProcessEntry.th32ProcessID);
    end;
  end;
ajob
Thanks for that! I'd love to find out why it's causing problems though. I keep hoping there's something I can do to fix things.
MarkF
Perhaps a bug report to NVidia?
Scott W
Scott, agreed 100%. It's just that if this only affects Delphi applications then I'm not sure if they will be keen on fixing it. I'm hoping to get more info before I go that route.
MarkF
There are frequently used programs made in Delphi. Skype comes to mind. I'm pretty sure nVidia would like Skype to work.
Lars Truijens