我使用自己的.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 XE4 Update 1.当我在Windows 8上构建并运行使用Win64平台编译的简单VCL应用程序时,我遇到了一个错误:
"Unable to create process: ...\project1.exe"
Run Code Online (Sandbox Code Playgroud)
但是,如果我运行project1.exe没有调试,它的工作原理.
我试图找出发生了什么,但未能纠正问题.
我试过这些:
卸载并重新安装XE4
我跑了C:\Program Files (x86)\Embarcadero\RAD Studio\11.0\bin\dbkw64_18_0.exe,它闪了一会儿,关闭没有任何错误.其他Window 8机器将运行程序并保留在桌面上.
我重置了Window 8防火墙规则.当我在调试器中运行应用程序时,它没有提示我通常的防火墙规则对话框.
我为其添加了防火墙规则dbkw64_18_0.exe,但它不起作用
当我尝试使用Win64平台调试应用程序时,rmtdbg180.exe会创建一个新进程.每次尝试在调试器中启动应用程序都将创建一个新rmtdbg180.exe进程.在其他Windows 8计算机上不会发生这种情况.
任何人都有想法我的机器会发生什么?
我的Win32应用程序是使用运行时包构建的.我们可能总是使用HInstance作为参考来了解进程的当前执行点的运行时包.
我的应用程序可能在运行时加载少量运行时包 给定一个对象,是否可以知道对象(或类)属于哪个运行时包(或包THandle)?
我正在编写一个尝试调用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 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构造的参数可能有问题.但是,我无法弄清楚如何.有任何想法吗?
我写了一个简单的VCL win32应用程序,它具有以下代码:
procedure TForm5.Button1Click(Sender: TObject);
begin
ShowMessage('bingo');
end;
Run Code Online (Sandbox Code Playgroud)
我使用运行时包编译了应用程序并打开了以下开关:
输出包含以下文件:
两个运行时包是:
我在Button1Click处理程序中设置了一个断点,如果我在调试器模式下运行应用程序,本地IDE调试器将停在那里.
接下来,我想尝试使用运行时包远程调试应用程序.
我将远程配置文件分配给32位Windows平台.测试连接与远程配置文件一起使用.PAServer也是在远程机器中启动的.当我尝试使用Delphi XE2 IDE调试器运行应用程序时,我注意到有4个文件被复制到远程机器:
但是,事件日志显示:
Module Load: Project1.exe. No Debug Info. Base Address: $00400000. Process Project1.exe (1676)
Run Code Online (Sandbox Code Playgroud)
由于模块没有调试信息,因此所有断点都将无法触发.
我已经尝试构建没有运行时包的单个文件.exe应用程序.相同的远程调试器步骤工作,我可以远程调试应用程序.
使用运行时包构建的应用程序使远程调试失败的原因是什么?
我的网络中的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 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 IDE在最近几个版本(2010,XE,XE2,XE3,XE4)中使用InstallAware作为安装程序.如果安装了所有IDE版本,则使用正常的setup.exe安装会将几GB文件复制到c:\ programdata中.
安装程序会快速占用磁盘空间,特别是对于使用昂贵的SSD硬盘的用户而言.
是否可以在不将文件复制到c:\ ProgramData的情况下设置Delphi IDE?是否建议在安装后手动删除这些文件?卸载以前版本的IDE会删除这些文件,但作为组件制造商,我需要这些IDE进行测试.
Delphi在单元中引入了一个新的JSON编组程序,单元中REST.JsonReflect存在类似的JSON编组程序Data.DBXJSONReflect.两个单元都引入TJSONConverters了创建TJSONMarshal和TJSONUnMarshal实例.
REST.JsonReflect.TJSONConverters和之间有什么区别Data.DBXJSONReflect.TJSONConverters?
将REST.JsonReflect.TJSONConverters取代Data.DBXJSONReflect.TJSONConverters?
有什么情况我应该用Data.DBXJSONReflect.TJSONConverters而不是REST.JsonReflect.TJSONConverters?