我们有一个使用SOAP(THTTPRIO等)通信的delphi XE应用程序,默认情况下(在delphi中)通过WinInet.dll工作.我们使用https身份验证修复了身份验证代码以使其正常工作,并且当https的用户名和密码正确时,一切都很好.
问题是,当身份验证详细信息不正确时,您会从Windows获得一个消息框,这可能是由WinInet.dll本身弹出的.我想让那个对话框消失.我无法弄清楚如何更改我的Delphi SOAP,因此密码不会出现.
情况与以下方面的问题不同:
我正在做他正在做的所有事情,包括调用InternetSetOption(...)来设置用户名和密码.
我没有使用带有自签名证书的服务器,所以soIgnoreInvalidCerts标志不适用于我的情况.
不知何故,我想我需要在WinInet中获得一些API调用,告诉它不要弹出InternetErrorDlg它有弹出来询问用户的(有些版本的Windows说Windows安全选项).
在我的情况下,我们在配置文件中使用的用户名和密码正在使用,它是错误的(过时),因此我们希望WinInet代码只返回错误而不是弹出对话框.
也许这个家伙真正做到的另一个问题是如何做到这一点,但这个问题的细节不足以看出他是如何做到的.接受的答案对我不起作用.
我遵循的一些死胡同:
WinInet MSDN文档PLUGIN_AUTH_FLAGS_CAN_HANDLE_UI- 似乎不适用于WinInet用户,而是适用于插件.
WinInet MSDN文档讨论了InternetSetOption,一些新闻组引导我进入以下on-before-post事件处理程序代码:
procedure TMyDevice.HTTPWebNodeOnBeforePost(
const HTTPReqResp: SOAPHTTPTrans.THTTPReqResp; Data: Pointer);
var
SecurityFlagsLen:DWORD;
SecurityFlags:DWORD;
begin
{ authentication, NTLM+HTTPS, WinInet authentication set via WinInet SET INTERNET OPTION API.
This approach recommended on newsgroups for https basic authentication. }
if fUserName<>'' then
if not InternetSetOption(Data,
INTERNET_OPTION_USERNAME,
PChar(fUserName),
Length(fUserName)) then
raise EWebServiceAuthException.Create(SysErrorMessage(Windows.GetLastError));
if fPassword<>'' then
if not InternetSetOption(Data,
INTERNET_OPTION_PASSWORD,
PChar(fPassword),
Length (fPassword)) then
raise EWebServiceAuthException.Create(SysErrorMessage(Windows.GetLastError)); …Run Code Online (Sandbox Code Playgroud) 我想用INTAIDEINsightService或许AddItem或AddActionList添加到在Delphi的IDE洞察力功能的条目.
根据Delphi OTA wiki, INTAIDEINsightService 允许您注册自己的操作.我能找到的唯一参考就是这里,它提到了API的名称,并且它存在.Delphi中没有任何关于它的帮助.ToolsAPI.pasDelphi XE中的单元在此界面中显示了两个方法,可用于注册操作:
function AddActionList( Actions: TCustomActionList; ... ): Integer;
procedure RemoveActionList(const Index: Integer);
Run Code Online (Sandbox Code Playgroud)
注释说"项目将显示为[描述|]类别| TCustomAction.Caption.不会显示未指定类别的包含操作.".
我无法使用操作找到任何其他文档或示例.一个简单的"hello world"示例,其中一个动作,或者只是一个项目,在描述或类别"helloworld"中注册,然后可以搜索并在您点击F6时显示,这将是完美的,但是动作是首选.
看起来这样的向导必须实现INTAIDEInsightItem才能在IDE洞察中呈现自己,但我不确定这是否是"必需"的hello-world样本.我不确定你是否必须使用动作,或者常规的"项目"添加是否足够.
(我的最终目标是创建一个新的gExperts风格的专家"通过使用IDE洞察力按名称搜索我的库路径中的任何单元"但我会首先将一个项目的名称添加到ide一个项目中.)
我之前在Delphi XE2时间框架中问过这个问题,然后答案是一个非常丑陋的黑客.
根据官方发布的说明,现在Delphi XE3支持非客户端主题.你如何在Firemonkey FM2中的Delphi XE3中做到这一点?
我认为它必须与风格书有关,但我无法弄明白.表单本身有一个"EnableBorderStyling"属性,我设置为true,我想我必须加载包含一些非客户主题数据的样式,但我找不到包含它的样式.
帮助与此主题无关.
Update2好吧,它没有被破坏,只是因为我没有包含这个样式元素的样式(正如RRUZ所说).
procedure TForm1.FormShow(Sender: TObject);
begin
StyleBook := StyleBook1;
WindowBorder.UpdateStyle;
end;
Run Code Online (Sandbox Code Playgroud)
Update3:样式文件似乎位于两个不同的位置,这令人困惑:
C:\Program Files (x86)\Embarcadero\RAD Studio\10.0\Redist\styles\Fmx
C:\Users\Public\Documents\RAD Studio\10.0\Styles
Run Code Online (Sandbox Code Playgroud)
请注意,我在任一点上都没有Luna.Style(firemonkey样式),但使用样式编辑器工具只需5秒.(打开,另存为,并将类型更改为.Style,我有一个!)
UPDATE4:RRUZ的答复工作,但我的系统(Windows 8 RTM)的非客户端的风格不看的权利,他们周围的地区白角on't完全绘制.调整窗口大小使它消失,我很清楚我应该能够强制使用WM_NCREPAINT或其他东西,然后让它消失.
在Delphi 2009及更高版本中,您可以将此行添加到项目.dpr中,以在应用程序可执行文件中设置TSAWARE PE标志:
{$SetPEOptFlags IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE}
Run Code Online (Sandbox Code Playgroud)
我认为(错误地)Delphi 2007不支持这种语法.我有一个应用程序,我无法从2007年移植到更新的Delphi版本(任务正在进行中,但未来几个月内不会完成) .
更新它只是必须将Windows添加到项目.dpr中.
如果修改了RC文件,Delphi将再次编译它.如果RC文件具有引用已更改文件的RCDATA或BITMAP声明,则Delphi不会再次将.RC文件重新编译为.RES,直到通过删除.RES文件或执行"触摸"(修改文件时间戳)强制它为止在顶级.RC文件.
这是TEST.RC文件的示例:
SAMPLE RCDATA "File.txt"
Run Code Online (Sandbox Code Playgroud)
当修改TEST.RC时,这将导致重新编译,当"File.txt"被修改时,但是Delphi不会在"编译"上重新编译资源.我不愿意只使用"Build",因为它将我的时间从几秒钟增加到几分钟.
有没有人让Delphi与.RC文本文件和依赖项一起正常工作?虽然有些人添加资源而从不更改它们,但我已经开始使用.RC文件来处理我可能经常更改的内容,例如.RC文件中RCDATA部分中的二进制或文本数据.
请注意,尝试在预构建或后构建中放置"删除.res"步骤似乎打破了Delphi IDE /编译器.我可以在IDE外部进行外部排序(在运行msbuild之前总是删除某些.res文件),但在IDE中,Delphi并没有给我太多选择.
有没有人有解决方案?(我在Delphi 2007中遇到了这个问题,但是任何适用于任何版本的Delphi从2007到XE3的解决方案都是受欢迎的.)
我使用XCode 4.5创建了一个新的命令行工具(创建Mac OS X命令行应用程序的方法),但我现在想要为它添加一个框架.构建阶段中的框架列表为空.
我可以添加.h/.m目标C类头和我编写的实现文件,但我不知道如何将"命令行工具"变成旧的XCode可能有不同的模板; 可以访问Core Foundation框架的命令行应用程序(不是Cocoa应用程序),或者我选择添加到其中的任何其他框架.
此外,XCode 3中曾经有一个" 核心基础工具 "选项,现在在哪里?
(更新:我在Target Dependencies中单击了"+",这看起来很合理,但是它只给我一个空的列表添加.我想在其他地方必须有一些东西你必须改变才能让东西显示在Target Dependencies中如果我可以说,新用户并不完全清楚.因此,这个公共服务信息,问题和答案.嘿Apple,你如何将其改为"链接库或框架",以便框架框架出现在那里.让我们猜测,当我们所知道的唯一一个词是Framework时,我们是在添加一个库还是一个依赖,这让人感到困惑.)
我对将std::string密钥和大struct值放入容器之类所涉及的堆和按值与引用语义有点混淆boost::interprocess::map.
这是我的情况,以及我正在使用的一些typedef:
typedef std::string AreaKeyType;
typedef DATA_AREA_DESC AreaMappedType; // DATA_AREA_DESC is a big struct.
typedef std::pair<const AreaKeyType, AreaMappedType> AreaValueType;
typedef boost::interprocess::allocator<AreaValueType, boost::interprocess::managed_shared_memory::segment_manager> AreaShmemAllocator;
typedef boost::interprocess::map<AreaKeyType, AreaMappedType, std::less<AreaKeyType>, AreaShmemAllocator> AreaMap;
Run Code Online (Sandbox Code Playgroud)
这是我如何插入AreaValueType(这是std :: pair的typedef):
AreaValueType A(areaKey, arearec);
anAreaMap->insert(A);
Run Code Online (Sandbox Code Playgroud)
我相信上面的代码将我在本地(非共享内存)堆栈上的std :: pair复制到共享内存区域.我可以在boost :: interprocess :: map中获取该共享内存区域的句柄,还是仅限于将该记录整回并整个存储?(换句话说,我可以将类似结构的东西存储到boost进程间映射中,然后更新该记录中的单个字节,或者我必须通过替换DATA_AREA_DESC结构中的所有字节来更新整个记录,全新字节).
进一步澄清:
我有一个普通的旧ANSI C DLL导出api,内部使用C++和Boost :: interprocess :: map.该函数应该在地图中创建一个项目,然后返回一个句柄.如何在boost :: interprocess :: map中插入一些东西,然后将一个句柄返回给非C++用户,最好是强制转换为void*或者unsigned long?我所能做的就是通过查找std :: string键值从共享内存中获取内容,并将新记录写入内存.我希望能够保持对共享内存对象的引用.
如果我不能直接这样做,我将如何间接地做到这一点?我想我可以保持一个非共享内存的std ::向量,并分配一个非共享内存的std :: string持有areaKey,这是一个std :: string的值,然后做的投void*项目返回std::string然后使用它从共享内存区域中获取记录.对于一些如此基本的东西来说,这似乎都是非常必要的工作.也许boost :: interprocess …
I want to enforce coding standards for our Delphi codebase.
A few colleagues have suggested Code Healer and Pascal Analyzer. I've had a look at these tools and they aren't suitable.
I was hoping to be able to do the same thing that CheckStyle for Java or StyleCop for C# can do
今天有一位朋友问我下面的代码:
var
a: Integer;
begin
ShowMessage(IntToStr(a));
end;
Run Code Online (Sandbox Code Playgroud)
这是局部变量,尚未初始化,好吗?
将代码放在按钮组件的OnClick事件中,然后以下面三种不同的方式运行代码:
我在两台不同的计算机上测试代码并看到相同的结果,对此有何看法?
前言; 这不是一般的"我有一个漏洞的巨型应用程序"问题.这是一个特定的问题,关于自动引用计数在一个近乎琐碎的演示应用程序中无法正常工作,具有完整的源代码,或细微的代码生成或编译器问题,或者在工具中的错误.(TLDR:哦.实际上是一个奇怪的小竞争条件)
我感到困惑的是,仪器的"分配"列表显示了一个实例泄漏但是,我有一个该类的实例,只有一个,而ARC正在调用dealloc方法,我知道它被调用因为在dealloc完成时会打印一条NSLog消息,但它仍会显示在Instruments中的泄漏列表中.
retainCount永远不会超过1.它没有被任何人保留,并且它被释放,但它看起来像是"泄漏",因为它在Instrument的泄漏中显示为活动实例.
怎么可能?
我还在学习ARC的Objective-C,所以我认为我必须犯一个常见的初学者错误.这是我唯一的init和我的对象的dealloc:
- (id) initWithMessage:(NSString*)messageForUser
{
self = [super init];
if (self)
{
_message = messageForUser;
NSLog( @"from constructor: %@",_message);
}
return self;
}
- (void)dealloc {
NSLog(@"Goodbye cruel world. One WPMyObject signing off.");
// [message release]; // ARC forbiddeth thee! Begone release.
_message = nil;
// [super dealloc]; // ARC forbiddeth explicit super dealloc
}
Run Code Online (Sandbox Code Playgroud)
只是为了看我是否可以,我试着调用[super dealloc]dealloc方法,ARC阻止你一个错误,这很好,因为它会为你做这件事.但是当我编写自己的init方法时,它并没有阻止我.
当我在XCode中使用"Run"运行程序时,我得到了"再见残酷的世界"NSLog消息,正如我希望的那样,当dealloc运行时,我也得到了这个实例仍然存在的证据.运行时,使用使用内存泄漏模板的Instruments分析:
如果我在没有下面的实例创建代码的情况下运行,我只报告了一些标准库malloc泄漏,但如果我添加此代码,则会发生所有泄漏:
WPMyObject * myObject = [[WPMyObject alloc] initWithMessage: @"Hello World!\n" ];
Run Code Online (Sandbox Code Playgroud)
这就是我所看到的,并且我认为我理解是告诉我WPMyObject的唯一实例是泄漏:

完整的源代码非常简单(使用Objective-C的一个小型Mac OS X命令行应用程序 …
delphi ×7
boost ×1
c++ ×1
cocoa ×1
coding-style ×1
delphi-2007 ×1
delphi-ide ×1
delphi-xe ×1
delphi-xe3 ×1
firemonkey ×1
frameworks ×1
instruments ×1
ios ×1
objective-c ×1
soap ×1
toolsapi ×1
visual-c++ ×1
wininet ×1
xcode ×1
xcode4 ×1