小编Chr*_*ton的帖子

QuickReport抛出"当前没有默认打印机选择"的例外情况

我创建了一个打印TQuickReports的Delphi服务.如果编译并作为Windows应用程序运行,一切正常.但是当转换为作为服务运行时,尝试创建包含TQuickRep组件的表单会引发异常.

这项服务在许多其他盒子上运行良好,但特别是没有这个.以下是一些细节:

  • 使用QuickReport版本4.07
  • Box是Windows Server 2008操作系统.
  • 使用Delphi 2007
  • Printer.Printers.Count返回一个正值.事实上,我可以列出所有的打印机.
  • 我尝试使用本地系统帐户运行该服务并以管理员身份登录.

printing delphi windows-services

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

WM_COPYDATA字符串未出现在目标应用程序中

我正在尝试在Delphi 2010中的两个应用程序之间传递信息.

我正在使用我过去成功使用的简化版代码(简化因为我不需要发件人知道发送已成功)我已经将收到的发送简化为一对示例应用程序,实质上如下

发送

procedure TMF.SendString;
var
   copyDataStruct: TCopyDataStruct;
   s: AnsiString;
begin
   s := ebFirm.Text;
   copyDataStruct.cbData := 1 + length(s);
   copyDataStruct.lpData := PAnsiChar(s);
   SendData(copyDataStruct);
end;

procedure TMF.SendData(copyDataStruct: TCopyDataStruct);
var
   rh: THandle;
   res: integer;
begin
   rh := FindWindow(PChar('TMF'), PChar('Get Phone'));
   if rh = 0 then
   begin
      // Launch the target application
      ShellExecute(Handle, 'open', GetPhone, nil, nil, SW_SHOWNORMAL);
      // Give time for the application to launch  
      Sleep(3000);
      SendData(copyDataStruct); // RECURSION!
   end;
   SendMessage(rh, WM_COPYDATA, Integer(Handle), Integer(@copyDataStruct));
end;
Run Code Online (Sandbox Code Playgroud)

接收申请

procedure TMF.WMCopyData(var Msg: TWMCopyData);
var …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-2010 wm-copydata

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

线程完成但循环不会结束

我用一些似乎不正确的假设编写了一些线程代码,整数是线程安全的.现在似乎虽然它们是,但我对它们的使用并不是线程安全的.我使用全局整数ThreadCount来保存线程数.在线程创建期间,我增加ThreadCount.在线程销毁期间,我减少它.在创建所有线程之后,我等待它们完成(ThreadCount应该降为0),然后编写我的最终报告并退出.

有时候(5%),我从来没有达到0,即使对我的日志的验尸检查显示所有线程都运行并完成.因此所有迹象都表明ThreadCount遭到践踏.我一直告诉自己这是不可能的,因为它是一个整数,我只是使用inc/dec.

这里有一些相关代码:

var  // global
  ThreadCount : integer;            // Number of active threads
...

constructor TTiesUpsertThread.Create(const CmdStr : string);
begin
  inherited create(false);
  Self.FreeOnTerminate := true;
...
  Inc(ThreadCount);      // Number of threads created.  Used for throttling.
end;

destructor TTiesUpsertThread.Destroy;
begin
  inherited destroy;
  Dec(ThreadCount);     // When it reaches 0, the overall job is done.
end;

...
//down at the end of the main routine:

    while (ThreadCount > 0) do   // Sometimes this doesn't ever end.  
    begin
      SpinWheels('.'); // sleeps for 1000ms …
Run Code Online (Sandbox Code Playgroud)

delphi multithreading thread-safety

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

Indy 9和Windows Server 2003之间的不兼容性?

我在某些Windows 2003服务器上遇到Delphi应用程序的问题.它使用webservice调用来连接另一台服务器并来回传输数据.一旦应用程序进入Authenticate方法,应用程序就会死亡.该应用程序已经使用Win Server 2003在以前的盒子上工作多年,但它不适用于新建的机器.这些机器在大多数情况下都以相同的方式设置,但显然有一些配置设置不同,我无法追踪.此外,虽然在对Authenticate的调用中错误变得明显,但是数据包嗅探证明应用程序和它试图联系的服务器之间没有任何事情发生,这加强了我的想法,即在设置连接的早期就会死亡.我无法在本地复制错误,因此我无法在调试器中单步调试应用程序.有关为什么Indy 9 Delphi网络连接可能会无声地失败的任何想法?

delphi dep soap delphi-2007 delphi-2005

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

工具显示bpl入口点?

当我知道它应该在那里时,试图看看为什么我们得到"未找到入口点".除了地图,还有一个工具可以"探索".bpl或.dll并显示入口点吗?

delphi bpl entry-point

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

Delphi LoadLibrary无法找到DLL其他目录 - 有什么好的选择吗?

两个Delphi程序需要加载foo.dll,其中包含一些将客户端身份验证证书注入SOAP请求的代码.foo.dll位于c:\ fooapp\foo.dll中,通常由c:\ fooapp\foo.exe加载.这很好.另一个程序需要相同的功能,但它位于c:\ program files\unwantedstepchild\sadapp.exe中.两个aps都使用以下代码加载DLL:

FOOLib := LoadLibrary('foo.dll'); 
...
If FOOLib <> 0 then 
begin
  FOOProc := GetProcAddress(FOOLib , 'xInjectCert');
  FOOProc(myHttpRequest, Data, CertName);
end;
Run Code Online (Sandbox Code Playgroud)

它适用于foo.exe,因为dll就在那里.sadapp.exe无法加载库,因此FOOLib为0,其余的永远不会被调用.因此,sadapp.exe程序默默无法注入证书,当我们对生产进行测试时,证书缺失,连接失败.显然,我们应该完全限定DLL的路径.在没有详细介绍的情况下,测试的某些方面直到最近都掩盖了这个问题,现在修复代码基本上已经太晚了,因为这需要完整的回归测试,而且没有时间.

既然我们把自己画成了一个角落,我需要知道是否有任何我忽略的选择.虽然我们无法更改代码(对于此版本),但我们可以调整安装程序.我发现将c:\ fooapp放入路径可以正常工作.将foo.dll的第二个副本直接添加到c:\ program files\unwantedstepchild中也是如此.c:\ fooapp\foo.exe将在sadapp.exe运行时一直运行,所以我希望Windows能够找到它,但显然不是.有没有办法告诉Windows我真的想要相同的DLL?也许一个清单或什么?这是我正在寻找的那种"魔术子弹".我知道我可以:

  1. 修改Windows路径,可能在安装程序中.那很难看.
  2. 将DLL的第二个副本直接添加到unwantedstepschild文件夹中.也很难看
  3. 在我们编码和测试正确的修复时延迟项目.不能接受的.
  4. 其他?

感谢您的指导,尤其是"其他".我知道这个问题不一定是Delphi特有的.谢谢!

delphi dll path loadlibrary

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

Delphi中的区域 - 默认情况下是否可以定义它们?

自Delphi 2005以来,Borland/CodeGear在IDE中引入了这些区域.这是一个好主意,但在一些casses我希望我的区域默认展开在其他折叠.如果有参数或选项可以完成这项工作?我正在使用Delphi 2007.

ide delphi code-regions

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