小编Cha*_*ang的帖子

删除package.dpk文件中的{$ R*.res}将删除.dproj文件中的rccompile

我使用自己的.rc文件生成自定义资源条目,包括版本信息.

我的library.rc文件是:

#include "app.rc.h"
VS_VERSION_INFO VERSIONINFO
FILEVERSION _FileVersion
PRODUCTVERSION _FileVersion
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
FILEFLAGS 0
FILEOS VOS__WINDOWS32
FILETYPE VFT_APP
FILESUBTYPE VFT2_UNKNOWN
BEGIN
  BLOCK "VarFileInfo"
  BEGIN
    VALUE "Translation", 0x0409, 1252
  END
  BLOCK "StringFileInfo"
  BEGIN
    BLOCK "040904E4"
    BEGIN
      VALUE "InternalName",       App_InternalName "\0"
      VALUE "CompanyName",        App_CompanyName "\0"
      VALUE "FileDescription",    App_ProductName "\0"
      VALUE "FileVersion",        _FileVersionStr "\0"
      VALUE "ProductName",        App_ProductName "\0"
      VALUE "ProductEdition",     App_ProductEdition "\0"
      VALUE "LegalCopyright",     "Copyright \251 " App_CompanyName "\0"
      VALUE "CompanyURL",         App_CompanyURL "\0"
      VALUE "ProductURL",         App_ProductURL "\0"
      VALUE "SupportURL",         App_SupportURL "\0"
      VALUE "AppRegistryPath", …
Run Code Online (Sandbox Code Playgroud)

delphi resources rc package

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

在Windows 8中调试Win64应用程序时"无法创建进程...\project1.exe"

我正在使用Delphi XE4 Update 1.当我在Windows 8上构建并运行使用Win64平台编译的简单VCL应用程序时,我遇到了一个错误:

"Unable to create process: ...\project1.exe"
Run Code Online (Sandbox Code Playgroud)

但是,如果我运行project1.exe没有调试,它的工作原理.

我试图找出发生了什么,但未能纠正问题.

我试过这些:

  1. 卸载并重新安装XE4

  2. 我跑了C:\Program Files (x86)\Embarcadero\RAD Studio\11.0\bin\dbkw64_18_0.exe,它闪了一会儿,关闭没有任何错误.其他Window 8机器将运行程序并保留在桌面上.

  3. 我重置了Window 8防火墙规则.当我在调试器中运行应用程序时,它没有提示我通常的防火墙规则对话框.

  4. 我为其添加了防火墙规则dbkw64_18_0.exe,但它不起作用

  5. 当我尝试使用Win64平台调试应用程序时,rmtdbg180.exe会创建一个新进程.每次尝试在调试器中启动应用程序都将创建一个新rmtdbg180.exe进程.在其他Windows 8计算机上不会发生这种情况.

任何人都有想法我的机器会发生什么?

windows delphi debugging

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

如何检查对象所属的.bpl包

我的Win32应用程序是使用运行时包构建的.我们可能总是使用HInstance作为参考来了解进程的当前执行点的运行时包.

我的应用程序可能在运行时加载少量运行时包 给定一个对象,是否可以知道对象(或类)属于哪个运行时包(或包THandle)?

delphi

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

Delphi IDE"Run without debugging"启动的进程继承了IDE的环境变量

我正在编写一个尝试调用Apache ANT脚本的Windows GUI应用程序.ANT脚本将构建并将Delphi项目组打包到最终的setup.exe中.ANT脚本构建了Delphi 2007/2010和Delphi XE应用程序.

我的ANT GUI应用程序由Delphi XE编译和构建.当我在Delphi XE中使用"Run without Debugging"运行应用程序时,应用程序无法与ANT脚本一起正常工作.ANT脚本不构建DCU,BPL和EXE未编译到我期望的文件夹中的应用程序.

但是,如果我在Windows资源管理器中启动我的GUI应用程序,ANT脚本会正确构建应用程序>所有DCU,BPL和EXE都已构建并保留在我分配的文件夹中.

调试GUI应用程序后,我发现使用Delphi的"Run without debugging"运行的应用程序将继承Delphi IDE中的环境变量.以下是我如何提取环境变量:

function GetAllEnvVars(const Vars: TStrings): Integer;
var
  PEnvVars: PChar;    // pointer to start of environment block
  PEnvEntry: PChar;   // pointer to an env string in block
begin
  // Clear the list
  if Assigned(Vars) then
    Vars.Clear;
  // Get reference to environment block for this process
  PEnvVars := GetEnvironmentStrings;
  if PEnvVars <> nil then
  begin
    // We have a block: extract strings from it
    // Env strings …
Run Code Online (Sandbox Code Playgroud)

delphi

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

Delphi XE2:调用WinAPI EnumResourceNames导致Win64平台中的访问冲突

在Delphi XE2 Win32平台上运行以下代码.但是,如果在调试模式下运行,在win64平台中编译相同的代码将导致"EnumRCDataProc"中的访问冲突:

procedure TForm2.Button1Click(Sender: TObject);
  function EnumRCDataProc(hModule: THandle; lpszType, lpszName: PChar; lParam:
      NativeInt): Boolean; stdcall;
  begin
    TStrings(lParam).Add(lpszName);
    Result := True;
  end;

var k: NativeInt;
    L: TStringList;
    H: THandle;
begin
  H := LoadPackage('resource.bpl');
  L := TStringList.Create;
  try
    EnumResourceNames(H, RT_RCDATA, @EnumRCDataProc, NativeInt(L));
    ShowMessage(L.Text);
  finally
    L.Free;
    UnloadPackage(H);
  end;
end;
Run Code Online (Sandbox Code Playgroud)

在Win64平台上调试Delphi XE2 IDE中的代码时,我发现EnumRCDataProc中的hModule值与变量H不匹配.我怀疑我为EnumRCDataProc构造的参数可能有问题.但是,我无法弄清楚如何.有任何想法吗?

delphi delphi-xe2

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

如何远程调试使用运行时包构建的Win32 VCL应用程序

我写了一个简单的VCL win32应用程序,它具有以下代码:

procedure TForm5.Button1Click(Sender: TObject);
begin
  ShowMessage('bingo');
end;
Run Code Online (Sandbox Code Playgroud)

我使用运行时包编译了应用程序并打开了以下开关:

  1. 调试信息 - > true
  2. 包括远程调试符号 - > true
  3. 断言,调试信息,本地符号,使用debug dcus - > true

输出包含以下文件:

  1. PROJECT1.EXE
  2. project1.rsm

两个运行时包是:

  1. vcl160.bpl
  2. rtl160.bpl

我在Button1Click处理程序中设置了一个断点,如果我在调试器模式下运行应用程序,本地IDE调试器将停在那里.

接下来,我想尝试使用运行时包远程调试应用程序.

我将远程配置文件分配给32位Windows平台.测试连接与远程配置文件一起使用.PAServer也是在远程机器中启动的.当我尝试使用Delphi XE2 IDE调试器运行应用程序时,我注意到有4个文件被复制到远程机器:

  1. PROJECT1.EXE
  2. project1.rsm
  3. vcl160.bpl
  4. rtl160.bpl

但是,事件日志显示:

Module Load: Project1.exe. No Debug Info. Base Address: $00400000. Process Project1.exe (1676)
Run Code Online (Sandbox Code Playgroud)

由于模块没有调试信息,因此所有断点都将无法触发.

我已经尝试构建没有运行时包的单个文件.exe应用程序.相同的远程调试器步骤工作,我可以远程调试应用程序.

使用运行时包构建的应用程序使远程调试失败的原因是什么?

delphi remote-debugging delphi-xe2

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

我可以使用IdUDPClient发送M-SEARCH请求吗?

我的网络中的uPNP设备很少.我正在尝试向网络发送M-SEARCH请求,并希望收到一些回复.这就是我想要的:

var sIP, sOut: string;
    iPort: Word;
    S: TStringBuilder;
begin
  S := TStringBuilder.Create;
  try
    S.Append('M-SEARCH * HTTP/1.1').AppendLine
     .Append('HOST: 239.255.255.250:1900').AppendLine
     .Append('MAN: "ssdp:discover"').AppendLine
     .Append('MX: 10').AppendLine
     .Append('ST: ssdp:all').AppendLine;

    IdUDPClient1.ReceiveTimeout := 3000;
    IdUDPClient1.Broadcast(S.ToString, 1900, '239.255.255.250');
    sOut := IdUDPClient1.ReceiveString(sIP, iPort);
    Memo1.Lines.Add(sIP);
    Memo1.Lines.Add(IntToStr(iPort));
    Memo1.Lines.Add(sOut);
  finally
    S.Free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

我从UDP客户端收不到任何东西.我使用Wireshark来监控网络流量,并且没有消息从我的主机发出.

有任何想法吗?谢谢.

我终于找到了答案:

uses
  System.SysUtils, IdUDPClient, IdStack;

var S: TStringBuilder;
    U: TIdUDPClient;
    iPeerPort: Word;
    sPeerIP, sResponse: string;
begin
  U := TIdUDPClient.Create(nil);
  S := TStringBuilder.Create;
  try
    S.Append('M-SEARCH * HTTP/1.1').AppendLine
     .Append('HOST: 239.255.255.250:1900').AppendLine
     .Append('MAN: "ssdp:discover"').AppendLine
     .Append('MX: 3').AppendLine
     .Append('ST: ssdp:all').AppendLine
     .AppendLine;

    U.BoundIP …
Run Code Online (Sandbox Code Playgroud)

delphi indy ssdp

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

如何为HTTP datasnap服务器动态加载服务器方法?

我正在使用Delphi XE2 DataSnap库.我的datasnap服务器是基于HTTP的(TIdHTTPWebBrokerBridge或ISAPI).

首次访问DataSnap服务时,TDSServer实例将通过TDSServerMethodProvider.Open和TDSServerMethodProvider.AddRegisterServerClasses注册所有可用的服务器方法(请参阅单元Datasnap.DSCommonServer.pas).

datasnap类名和服务器方法必须预先注册,否则当客户端访问服务时它将失败.

我想创建一个可以动态加载datasnap类和服务器方法的应用程序.我的datasnap应用程序在开始根据URL查找服务之前不知道类或服务器方法是否可用于访问.例如,一个URL,如:

http:/.../datasnap/rest/TServerMethods1/ReverseString
Run Code Online (Sandbox Code Playgroud)

将使应用程序在使用该方法之前查找类TServerMethods1并注册.

我们可以使用TWebModule.BeforeDispatch事件来标识Request.URL字符串,并确定要为相应的datasnap类加载哪些包.

通过使用这种方法,我可以编写一个灵活且可扩展的通用DataSnap应用程序.

在检查DataSnap源代码之后,我发现除非在现有的DataSnap源上做一些额外的工作,否则这是不可能的.TDSServerMethodProvider类中对注册至关重要的几个方法在私有部分中声明:AddRegisteredServerClasses,AddAllMethods.

TDSServerMethodProvider类似乎没有设计用于额外注册.它只允许注册一次.

delphi datasnap

5
推荐指数
0
解决办法
1433
查看次数

我可以从InstallAware setup.exe安装Delphi IDE而无需复制文件到c:\ programdata吗?

Delphi IDE在最近几个版本(2010,XE,XE2,XE3,XE4)中使用InstallAware作为安装程序.如果安装了所有IDE版本,则使用正常的setup.exe安装会将几GB文件复制到c:\ programdata中.

安装程序会快速占用磁盘空间,特别是对于使用昂贵的SSD硬盘的用户而言.

是否可以在不将文件复制到c:\ ProgramData的情况下设置Delphi IDE?是否建议在安装后手动删除这些文件?卸载以前版本的IDE会删除这些文件,但作为组件制造商,我需要这些IDE进行测试.

delphi

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

REST.JsonReflect和Data.DBXJSONReflect有什么区别?

Delphi在单元中引入了一个新的JSON编组程序,单元中REST.JsonReflect存在类似的JSON编组程序Data.DBXJSONReflect.两个单元都引入TJSONConverters了创建TJSONMarshalTJSONUnMarshal实例.

  • REST.JsonReflect.TJSONConverters和之间有什么区别Data.DBXJSONReflect.TJSONConverters

  • REST.JsonReflect.TJSONConverters取代Data.DBXJSONReflect.TJSONConverters

  • 有什么情况我应该用Data.DBXJSONReflect.TJSONConverters而不是REST.JsonReflect.TJSONConverters

delphi rest json marshalling datasnap

5
推荐指数
0
解决办法
526
查看次数