小编Bil*_*ven的帖子

当作为远程桌面应用程序运行时,Delphi TOpenDialog在Windows 2008中挂起

我有一个Delphi 2010 exe,它启动了第二个exe.在第二个exe中,有一个调用openDialog.execute的对话框.当它在远程桌面下的Windows 2008 Enterprise R2下运行,它会按预期运行,但是当作为远程应用程序运行时,只要弹出文件对话框,应用程序就会挂起,将所有应用程序窗口都变为白色.摆脱它的唯一方法是终止应用程序.我尝试用TFileOpenDialog替换TOpenDialog,结果是一样的.我已经考虑修改启动主应用程序的RDP文件,但是看不到任何会产生影响的参数.以前有没有人见过这种行为?


2010.07.13更新

这可以使用一个简单的例子重现.示例中有两个可执行文件.第一个是文件启动器,名为m_module.exe,它包含一个编辑,一个按钮和下面的代码.在单击启动按钮之前,我在编辑中更改可执行文件的名称以匹配第二个可执行文件:

procedure TForm1.Button1Click(Sender: TObject);
begin
     ShellExecute(Handle, 'open', stringToOLEstr(edit1.text) , nil, nil, SW_SHOWNORMAL) ; 
end;

procedure TForm1.FormShow(Sender: TObject);
begin
     edit1.text:=application.exename;
end;
Run Code Online (Sandbox Code Playgroud)

第二个可执行文件包含一个按钮,代码如下:

procedure TForm1.Button1Click(Sender: TObject);
begin
     OpenDialog1.execute;
end;
Run Code Online (Sandbox Code Playgroud)

第一个模块是从RDP文件启动的.

2010.07.14更新

我发现如果我复制以下dll:

thumbcache.dll 
dtsh.dll 
wkscli.dll 
Run Code Online (Sandbox Code Playgroud)

从\ Windows\System32文件夹进入应用程序文件夹,问题就消除了.

我进一步发现将\ Windows\System32文件夹中这些dll的所有权和权限级别从TrustedInstaller更改为管理员组具有相同的结果(将它们复制到应用程序目录正在改变我认为的所有权和权限)

为了确认这一点,我确认如果我将所有权和权限级别更改回远离管理员组的TrustedInstaller,则会再次出现错误.

所以看来这是某种访问问题.也许这有助于发现问题的原因.

2010.07.18更新

一些可能有用的其他信息(由Embarcadero提供):

这篇关于GetWindowsDirectory的MSDN文章http://msdn.microsoft.com/en-us/library/ms724454%28VS.85%29.aspx记录了在终端服务下运行的应用程序的一些有趣行为.虽然没有直接调用GetWindowsDirectory,但每个用户的Windows系统目录的沙盒可能会导致某种问题.也许GetOpenFileNameA的调用链中的一个DLL试图引用真实系统目录中的真实DLL而不是沙盒,从而导致权限违规.这只是猜测,但值得研究.如果您能够在服务器上运行SysInternals Process Monitor或Process Explorer,您应该能够看到commdlg32和堆栈跟踪中的其他DLL被加载.

所有旧应用程序(即,未为终端服务或远程桌面服务创建的所有应用程序)都在应用程序兼容性层下运行.请参阅此MSDN文章http://msdn.microsoft.com/en-us/library/cc834995%28VS.85%29.aspx.IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE标志在Windows.PAS中定义.出于测试目的,您可以将Windows添加到应用程序的PE头部,方法是将Windows添加到应用程序的USES部分,并在USES部分下面添加:

{$ SetPEOptFlags IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE}

这将导致您的应用程序绕过兼容层.我目前正在调查产生的进程(例如你的第二个exe)是否保留了在RDS下定义的应用程序的所有权限和设置.

windows delphi rda

12
推荐指数
1
解决办法
5977
查看次数

Unicode中chr(153)(TM SYMBOL)的等价物

在早期的Delphi版本中,我可以使用

s:=chr(153);
Run Code Online (Sandbox Code Playgroud)

在字符串中获取商标符号.在Delphi 2010中,它不再起作用,可能与unicode有关.将TM符号放入字符串的等效代码字符串是什么?

delphi unicode ascii

7
推荐指数
2
解决办法
4382
查看次数

释放优势数据库服务器表的代码示例

我有一组包含在 Advantage Database 数据字典中的表。该词典不再可用,并且表格将无法打开。

我想使用代码(而不是 Advantage Data Architect)释放这些表。

我能找到的唯一参考是帮助中列出的名为 ADSDDFreeTable 的函数。

该函数的文档位于此链接:

http://devzone.advantagedatabase.com/dz/WebHelp/Advantage11.1/index.html?ace_adsddfreetable.htm

但它没有提供代码示例,我无法理解如何使用它。

有人愿意展示如何使用此函数的代码示例吗(使用变量,而不是文字,文件名等)

非常感谢!

delphi advantage-database-server

4
推荐指数
2
解决办法
1083
查看次数

如何将Advantage API示例C代码转换为Delphi

我试图从Advantage Database文档中将示例代码转换为Delphi,但似乎无法使变量声明正确,从varType开始,也无法找出MAX_STR_LEN(常量,函数,其他?).

以下是示例中的代码:

 UNSIGNED32 DoDates( void )
 {  
      ADSHANDLE hTable;
      UNSIGNED16 usLength;
      UNSIGNED8 aucDOB[MAX_STR_LEN+1];
      ...
      usLength = MAX_STR_LEN+1
      AdsGetDate( hTable, "DOB", aucDOB, &usLength );
      ... 
 }
Run Code Online (Sandbox Code Playgroud)

我试过的Delphi代码是:

 procedure TForm1.fixARInvoiceEntryHeaderDates;
 var
      tableHandle:ADSHandle;
      aucDOB:pansichar;
      usLength:punsigned16;

 begin
      ...
      AdsGetDate(
      tableHandle,
      'inv_date',
      aucDOB,
      &usLength);
      ...
 end;
Run Code Online (Sandbox Code Playgroud)

delphi advantage-database-server

4
推荐指数
1
解决办法
236
查看次数

Delphi - 如何控制TOpenDialog的Z顺序

我有一个模式对话框,使用以下内容创建:

procedure TFormCompose.createParams(var Params: TCreateParams);
begin
     inherited createParams(Params);
     with Params do begin
          exStyle:=exStyle or WS_EX_APPWINDOW;
          wndParent:=getDesktopWindow;
     end;
end;
Run Code Online (Sandbox Code Playgroud)

在这种形式中,我创建了一个TOpenDialog实例.当它打开时,它会在主应用程序窗口后面发送我的第一个模态对话框.

有没有办法让TOpenDialog打开而不影响模态对话框的Z顺序?

谢谢!

delphi delphi-2007

3
推荐指数
1
解决办法
1473
查看次数

如何使用html上下文敏感帮助Delphi 2007 - 基础知识

我使用帮助和手册来创建Web帮助(HTML)文件.我想将此链接到我的Delphi 2007应用程序,以便在用户按F1键时弹出,理想情况下,弹出一个上下文敏感点.

这就是我尝试过的:

将HTMLHelpViewer单元添加到主窗体的uses子句中.
将HelpFile属性设置为index.htm文件的名称.
设置OnHelp事件(此事件不会在F1,btw上触发).

我也搜索了Stack Overflow和其他网络链接试图找到完成这个的步骤,当我找到线索时,我似乎无法找到一步一步的方法来完成这个.

谢谢你的帮助.

delphi chm

2
推荐指数
1
解决办法
2098
查看次数

Delphi Prism中的paramstr等价物是什么

是否有一个简单的语句可以在Delphi中给出类似于paramstr()的结果?

delphi oxygene delphi-prism

2
推荐指数
1
解决办法
326
查看次数

如何使用Advantage Database Server连接多个文件夹中的表

使用Advantage Database Server SQL,我需要能够连接位于不同文件夹中的空闲表.有没有办法做到这一点?

advantage-database-server

2
推荐指数
1
解决办法
708
查看次数

Delphi TDateTime变量不会在Delphi 2010中初始化

我在Delphi 2010中创建了一个简单的表单,在我输入的按钮的代码中只有一个按钮:

procedure TForm1.Button1Click(Sender: TObject);
var
     myDateTime:TDateTime;
begin
     myDateTime:=now; // shows as 12/30/99 in debugger
end;
Run Code Online (Sandbox Code Playgroud)

当我在Delphi XE2中运行这个完全相同的代码时,我得到myDateTime值的当前日期/时间.

我想我必须在Delphi 2010项目环境中设置错误,但不能想到它可能是什么.

任何帮助将非常感激.

谢谢!

发现的问题,编译器设置是将代码生成优化设置为true,并且该值显然表示为TDateTime的默认值.当我将优化设置更改为false时,我可以看到该值.

delphi tdatetime delphi-2010

2
推荐指数
1
解决办法
484
查看次数

如何在Oxygene中将字符串转换为整数

在Delphi中,有一个函数StrToInt()将字符串转换为整数值; 还有IntToStr(),它反过来.这些函数似乎不是Oxygene的一部分,我找不到对可以做到的东西的引用.怎么做到呢?

delphi oxygene

1
推荐指数
1
解决办法
7855
查看次数

如何使用 Digital-Metaphors Report Builder RAP 在计算字段中设置字体属性

我正在尝试使用 RAP 在 Digital-Metaphors Report Builder 中的变量中设置字体属性。我正在使用的代码是:

if (DBdetail['LINEATTR']='1') then begin
    budgetValue.font.style:=[fsBold];
end;
Run Code Online (Sandbox Code Playgroud)

但这不起作用,我收到编译时错误。如何设置字体样式?

delphi reportbuilder

1
推荐指数
1
解决办法
3477
查看次数

如何在Delphi 2010中设置待办事项列表类别

如何在Delphi 2010中设置待办事项列表类别.此语法不起作用:

// TODO 1 -cImportant: Do this!
Run Code Online (Sandbox Code Playgroud)

delphi delphi-2010

1
推荐指数
1
解决办法
3548
查看次数

将Azure数据库从Web扩展到新层会导致可用性问题

据我所知,将Azure数据库从已退役的层级扩展到新层只是在Azure门户中使用scale功能的问题.

在从退役阶段扩展到新阶层时,我无法在任何地方找到的是关于是否需要任何连接字符串更改(或任何其他可能导致不可用的问题)的明确答案.

我有一个需要升级的生产数据库,服务中断会非常糟糕.

database azure availability azure-sql-database

1
推荐指数
1
解决办法
193
查看次数