我有一个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下定义的应用程序的所有权限和设置.
在早期的Delphi版本中,我可以使用
s:=chr(153);
Run Code Online (Sandbox Code Playgroud)
在字符串中获取商标符号.在Delphi 2010中,它不再起作用,可能与unicode有关.将TM符号放入字符串的等效代码字符串是什么?
我有一组包含在 Advantage Database 数据字典中的表。该词典不再可用,并且表格将无法打开。
我想使用代码(而不是 Advantage Data Architect)释放这些表。
我能找到的唯一参考是帮助中列出的名为 ADSDDFreeTable 的函数。
该函数的文档位于此链接:
http://devzone.advantagedatabase.com/dz/WebHelp/Advantage11.1/index.html?ace_adsddfreetable.htm
但它没有提供代码示例,我无法理解如何使用它。
有人愿意展示如何使用此函数的代码示例吗(使用变量,而不是文字,文件名等)
非常感谢!
我试图从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) 我有一个模式对话框,使用以下内容创建:
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顺序?
谢谢!
我使用帮助和手册来创建Web帮助(HTML)文件.我想将此链接到我的Delphi 2007应用程序,以便在用户按F1键时弹出,理想情况下,弹出一个上下文敏感点.
这就是我尝试过的:
将HTMLHelpViewer单元添加到主窗体的uses子句中.
将HelpFile属性设置为index.htm文件的名称.
设置OnHelp事件(此事件不会在F1,btw上触发).
我也搜索了Stack Overflow和其他网络链接试图找到完成这个的步骤,当我找到线索时,我似乎无法找到一步一步的方法来完成这个.
谢谢你的帮助.
是否有一个简单的语句可以在Delphi中给出类似于paramstr()的结果?
使用Advantage Database Server SQL,我需要能够连接位于不同文件夹中的空闲表.有没有办法做到这一点?
我在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中,有一个函数StrToInt()将字符串转换为整数值; 还有IntToStr(),它反过来.这些函数似乎不是Oxygene的一部分,我找不到对可以做到的东西的引用.怎么做到呢?
我正在尝试使用 RAP 在 Digital-Metaphors Report Builder 中的变量中设置字体属性。我正在使用的代码是:
if (DBdetail['LINEATTR']='1') then begin
budgetValue.font.style:=[fsBold];
end;
Run Code Online (Sandbox Code Playgroud)
但这不起作用,我收到编译时错误。如何设置字体样式?
如何在Delphi 2010中设置待办事项列表类别.此语法不起作用:
// TODO 1 -cImportant: Do this!
Run Code Online (Sandbox Code Playgroud) 据我所知,将Azure数据库从已退役的层级扩展到新层只是在Azure门户中使用scale功能的问题.
在从退役阶段扩展到新阶层时,我无法在任何地方找到的是关于是否需要任何连接字符串更改(或任何其他可能导致不可用的问题)的明确答案.
我有一个需要升级的生产数据库,服务中断会非常糟糕.
delphi ×11
delphi-2010 ×2
oxygene ×2
ascii ×1
availability ×1
azure ×1
chm ×1
database ×1
delphi-2007 ×1
delphi-prism ×1
rda ×1
tdatetime ×1
unicode ×1
windows ×1