我应该使用我的应用程序重新分发msvcrt.dll并使用私有DLL,如果某些应用程序的lib动态依赖于msvcrt.dll?即系统的msvcrt.dll(dll hell)可能出现的任何不兼容问题?应用程序针对Windows Server系统.
我必须在客户区涂上什么颜色才能制作玻璃?
我使用以下方法将表单框架扩展到客户区:
DwmExtendFrameIntoClientArea(self.Handle, margins);
Run Code Online (Sandbox Code Playgroud)
我找不到微软的官方文档,说明DWM用玻璃代替什么颜色和/或alpha.DwmExtendFrameInClientArea上的文档甚至没有提到需要自定义颜色.只有传闻和神话,甚至需要特殊的颜色.
我能找到的最接近的是MSDN上的主题:
使用DWM的自定义窗口框架
为了使扩展帧可见,每个扩展帧的边下面的区域必须具有alpha值为0的像素数据.
更新:和博客文章:
Windows Vista for Developers - 第3部分 - 桌面窗口管理器
碰巧RGB黑色(0x00000000)的位模式与100%透明ARGB的位模式相同,因此您可以使用"黑色"GDI画笔实际绘制并假设您已指示DWM模糊绘制区域,结果将是所需的玻璃效果.
如果我按照他们的字面意思(alpha值为零的像素数据),我构造一个零alpha的颜色,并在扩展区域绘制:
Color fillColor = Color.FromArgb(0, 0, 0, 0); //(a, r, g, b)
e.Graphics.FillRectangle(new SolidBrush(fillColor), e.ClipRectangle);
Run Code Online (Sandbox Code Playgroud)
但玻璃效果没有出现:
替代文字http://i46.tinypic.com/anlmd4.png
如果我忽略引用的MSDN主题,而是使用完全不透明的黑色(而不是完全透明的黑色):
Color fillColor = Color.FromArgb(255, 0, 0, 0); //(a, r, g, b)
e.Graphics.FillRectangle(new SolidBrush(fillColor), e.ClipRectangle);
Run Code Online (Sandbox Code Playgroud)
玻璃效果确实出现了:
alt text http://i45.tinypic.com/2ug2ias.png
然后我开始相信不透明的黑色是DWM用玻璃代替的像素值.
但那我如何在玻璃区域上画黑色物品呢?
我测试过在玻璃区域上画一个黑色矩形,旁边有一个圆圈.奇怪的是,矩形没有出现,而圆圈确实出现; 两者颜色相同:
Brush …Run Code Online (Sandbox Code Playgroud) 我有一个为我的网站定义的最喜欢的图标:
<link rel="shortcut icon" type="image/x-icon" href="favicon.ico">
Run Code Online (Sandbox Code Playgroud)
添加图标后访问该网站的任何浏览器都可以显示图标.但我自己的浏览器拒绝显示图标.
我已经尝试了我能想到的链接的每个变体:
<link rel="shortcut icon" type="image/x-icon" href="favicon.ico">
<link rel="shortcut icon" type="image/x-icon" href="http://example.com/favicon.ico">
<link rel="icon" type="image/x-icon" href="favicon.ico">
<link rel="icon" type="image/x-icon" href="http://example.com/favicon.ico">
<link rel="shortcut icon" type="image/x-icon" href="favicon.ico">
<link rel="icon" type="image/x-icon" href="favicon.ico">
<link rel="shortcut icon" type="image/x-icon" href="http://example.com/favicon.ico">
<link rel="icon" type="image/x-icon" href="http://example.com/favicon.ico">
<link rel="shortcut icon" type="image/x-icon" href="renamed.ico">
Run Code Online (Sandbox Code Playgroud)
无关紧要,Internet Explorer(9)甚至拒绝尝试从服务器进行提取(从fiddler监控).
我多次尝试清除缓存:
(gear) -> Internet Options -> General -> Delete -> Temporary Internet Files
Run Code Online (Sandbox Code Playgroud)
Alex在这个答案中认为,喜爱的图标的缓存方式与常规网页内容不同,并且不遵循常规清算规则.
所以问题就变成了:我如何清除Internet Explorer最喜欢的图标缓存?
我正在使用MSXML的XmlHttpRequest对象发出请求:
IXMLHttpRequest http = new XmlHttpRequest();
http.open("GET", "http://www.bankofcanada.ca/stat/fx-xml.xml", False, "", "");
http.send();
Run Code Online (Sandbox Code Playgroud)
并且send成功了,我得到了我的xml数据.
除了XmlHttpRequest实际上没有打网络(我可以看到没有发出实际的http请求).并且Process Monitor显示文件实际上是从我的缓存中提供的:

所以我想指示XmlHttpRequest用户代理任何超过0秒的缓存内容都太旧了.执行此操作的标准方法是添加请求标头:
Cache-Control: max-age=0
Run Code Online (Sandbox Code Playgroud)
发送请求:
http = new XmlHttpRequest();
http.open("GET", "http://www.bankofcanada.ca/stat/fx-xml.xml", False, "", "");
http.setRequestHeader("Cache-Control", "max-age=0");
http.send();
Run Code Online (Sandbox Code Playgroud)
并且send成功了,我得到了我的xml数据.
除了XmlHttpRequest实际上没有打网络(我可以看到没有发出实际的http请求).Process Monitor显示文件实际上是从我的缓存中提供的.
那有什么不对?是max-age不是在做什么我想它呢?
来自RFC 2616 - 超文本传输协议,第14部分:标题字段定义:
其他指令允许用户代理修改基本过期机制.可以在请求中指定这些指令:
max-age
表示客户端愿意接受年龄不大于指定时间(秒)的响应.除非还包括最大指令,否则客户不愿意接受陈旧的响应.
这正是我想要的.
是Cache-Control: max-age=0不是我想要的,或者是MSXML的XmlHttpRequest对象错误?
这是MSXML XmlHttpRequestCOM对象:
该max-age指令由客户端添加,以供所有要遵守的缓存使用.来自RFC:
Cache-Control通用头字段用于指定请求/响应链中的所有缓存机制必须遵守的指令 …
如何将程序集清单添加到.NET可执行文件中?
程序集清单是一个XML文件,它添加到具有资源类型RT_MANIFEST(24)的.NET可移植可执行程序(PE )中.
程序集清单用于声明有关可执行文件的许多内容,例如:
如果我想禁用DPI扩展,因为我是一个优秀的开发人员:
<!-- We are high-dpi aware on Windows Vista -->
<asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>true</dpiAware>
</asmv3:windowsSettings>
</asmv3:application>
Run Code Online (Sandbox Code Playgroud)我可以声明我是在Windows 7上设计和测试的,我应该继续依赖Windows 7中的任何错误
<!-- We were designed and tested on Windows 7 -->
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!--The ID below indicates application support for Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
</application>
</compatibility>
Run Code Online (Sandbox Code Playgroud)我可以声明我是一个优秀的开发人员,不需要文件和注册表虚拟化
<!-- Disable file and registry virtualization -->
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
Run Code Online (Sandbox Code Playgroud)我可以声明我依赖于Microsoft Common Controls库的特定版本6 :
<!-- Dependency on …Run Code Online (Sandbox Code Playgroud)我想在Visual Studio Express for Web中的TypeScript中使用get/set语法.我该如何启用它.编译时我目前收到此错误;
属性访问者仅在定位ES5或更高版本时可用
正在编译的文件具有构建操作TypeScriptCompile.我不知道如何在Visual Studio中添加必要的编译器开关.
任何帮助,将不胜感激.
编辑自2015年1月24日起:现在无法使用其他受信任的证书颁发机构.问答没有过时:
WinQual仍然拒绝签名:

当我们已经确定它是有效的数字签名时:

为了完整起见,我将离开其他人所做的编辑; 只是想指出他是多么的错.他可以忍受这种耻辱:
编辑截至2014年:现在可以使用其他受信任的证书颁发机构.问题和答案已经过时.
在2005年,我尝试与Microsoft建立WinQual帐户,因此我可以选择通过Windows错误报告(WER)自动提交的(如果有)故障转储文件.我不被允许拥有我的崩溃转储,因为我没有Verisign证书.相反,我有一个由Verisign子公司生成的更便宜的产品:Thawte.
您加入的方法是:您对它们提供的示例exe进行数字签名.这证明您是签署应用程序的同一签名者,他们从野外获得了崩溃转储.
在密码学上,需要私钥来在可执行文件上生成数字签名.只有该私钥的持有者才能为匹配的公钥创建签名.生成该私钥的人并不重要.这包括从以下位置生成的证书:
然而,Microsof的WinQual只接受Verisign生成的数字证书.甚至Verisign的子公司也不够好(Thawte).
任何人都可以想到微软不想接受代码签名证书的任何技术,法律或道德原因吗?WinQual网站说:
为何Winqual会员资格需要数字证书?
数字证书有助于保护您的公司免受那些试图冒充您的员工或者对您的公司进行欺诈行为的个人的侵害.使用数字证书可以证明用户或组织的身份.
某种程度上,Thawte数字证书不安全吗?
两年后,我向WinQual发送了提醒通知,我一直在等待能够进入崩溃堆.WinQual团队的回应是:
你好,
感谢您的提醒.我们已通知相关人员这仍是请求.
2008年,我在微软支持论坛上提出这个问题,回复是:
我们目前只接受VeriSign证书.我们没有压倒性的要求来支持其他类型的证书.
接受其他类型的证书不是"设置"可能意味着什么?
如果签署WinQual.exe测试应用程序的密钥的指纹与签署可执行文件的指纹相同,那就是你遇到的崩溃转储:它已被证明 - 它们是我的崩溃转储,将它们交给我.
并不像是有一个特殊的API来检查Verisign数字签名是否有效,而不是所有其他数字签名.无论谁生成密钥,有效签名都有效.
微软可以自由地不信任签名者,但这与身份不同.
所以这是我的问题,任何人都可以想到为什么WinQual没有设置为支持数字签名的任何实际原因?
一个人认为答案是他们只是懒惰:
不是我知道,但我认为运行winQual系统的团队是一个现场团队,而不是一个开发团队 - 就像在个性和技能组合中一样,旨在维护现有系统.我可能错了.
他们不想做改变它的工作.但是,任何人都可以想到任何需要改变的事情吗?无论生成密钥的是什么,它都是相同的逻辑:"指纹是否匹配".
我错过了什么?
很高兴听到其他开发者的故事.这样我知道我并不孤单,这个问题可以作为微软改变的工具.即使我最初的意图是一个抱怨的咆哮,为了保持这个有效的StackOverflow问题,我正在寻找技术原因,为什么微软只能接受Verisign证书.
加密API并不关心颁发证书的公司名称是什么:它只关心签名者链返回受信任的根.
特别是微软可能没有使用已建立的加密基础设施,但仅限于Verisign?
如果有人可以指向任何博客条目,程序经理或开发人员解释原因,我或许会满意.
人们似乎忽略了我的问题.Windows已经具有代码基础结构,以确保根权限信任数字签名证书.这是我们签名的可执行文件上的数字签名的屏幕截图.
您可以看到我们的证书是由Thawte的代码签名机构证书签署的,而证书又由Thawte签署:
替代文字http://i34.tinypic.com/2hi2cr8.jpg
默认情况下,"thawte"证书随Windows发布:
替代文字http://i38.tinypic.com/ydfr.jpg
该Thawte完美服务器CA是够好的了,Windows和Internet Explorer的每个副本已经信任它.并且已经有一个已建立的API来检查证书是否有效(即信任).
当Winqual的人来了,他们将不得不去他们的出路,以避免检查正确的方式,而是推出自己的解决方案,硬编码只威瑞作为一个受信任的根.为什么他们会不顾一切 …
我正在寻找英特尔数据表:英特尔®64和IA-32架构软件开发人员手册 ,我找不到它们之间的区别
在英特尔数据表中,我可以找到两个指令:
该指令可用于从128位存储器位置加载XMM寄存器,将XMM寄存器的内容存储到128位存储器位置,或在两个XMM寄存器之间移动数据.
唯一的区别是:
要将双四字移入或移出未对齐的存储单元,请使用MOVDQU指令.
和
要将打包的单精度浮点值移入或移出未对齐的内存位置,请使用MOVUPS指令.
但是我找不到两个不同指令的原因?
那么有人可以解释这个区别吗?
我的问题是:C#nativly支持后期绑定IDispatch吗?
假装我正在尝试自动化Office,同时兼容客户安装的任何版本.
在.NET世界中,如果您安装了Office 2000,那么从现在到结束,每个开发人员和每个客户都需要拥有Office 2000.
在.NET之前的世界中,我们使用COM与Office应用程序进行通信.
例如:
1)使用版本独立的ProgID
"Excel.Application"
Run Code Online (Sandbox Code Playgroud)
解析为:
clsid = {00024500-0000-0000-C000-000000000046}
Run Code Online (Sandbox Code Playgroud)
然后使用COM,我们要求将其中一个类实例化为一个对象:
IUnknown unk;
CoCreateInstance(
clsid,
null,
CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER,
IUnknown,
out unk);
Run Code Online (Sandbox Code Playgroud)
现在我们即将参加比赛 - 能够在我的应用程序中使用Excel.当然,如果你真的想要使用该对象,你必须调用一些方法来调用方法.
我们可以得到阿霍德不同的接口声明,翻译成我们的语言.这项技术很好,因为我们得到了
一些示例代码可能是:
Application xl = (IExcelApplication)unk;
ExcelWorkbook workbook = xl.Workbooks.Add(template, lcid);
Worksheet worksheet = workbook.ActiveSheet;
Run Code Online (Sandbox Code Playgroud)
但是使用接口有一个缺点:我们必须得到各种接口声明,转换成我们的语言.我们坚持使用基于方法的调用,必须指定所有参数,例如:
ExcelWorkbook workbook = xl.Workbooks.Add(template, lcid);
xl.Worksheets.Add(before, after, count, type, lcid);
Run Code Online (Sandbox Code Playgroud)
在现实世界中,这证明了我们愿意放弃的这些缺点:
而是使用IDispatch后期绑定:
Variant xl = (IDispatch)unk;
Variant …Run Code Online (Sandbox Code Playgroud) 我正在使用自动化(即COM自动化)在Internet Explorer(9)中显示一些HTML:
ie = CoInternetExplorer.Create;
ie.Navigate2("about:blank");
webDocument = ie.Document;
webDocument.Write(szSourceHTML);
webDocument.Close();
ie.Visible = True;
Run Code Online (Sandbox Code Playgroud)
出现Internet Explorer,显示我的html,其开头为:
<!DOCTYPE html>
<HTML>
<HEAD>
...
Run Code Online (Sandbox Code Playgroud)
注意: html5标准模式选择加入doctype
html
除非文件不符合ie9标准模式; 它是在ie8标准模式下:

如果我先将html保存到我的电脑:

然后查看那个 html文档,将IE放入标准模式:

我的问题是如何更新我的SpawnIEWithSource(String html)功能以使浏览器进入标准模式?
void SpawnIEWithSource(String html)
{
Variant ie = CoInternetExplorer.Create();
ie.Navigate2("about:blank");
webDocument = ie.Document;
webDocument.Write(html);
webDocument.Close();
ie.Visible = true;
}
Run Code Online (Sandbox Code Playgroud)
编辑:一个更详细,更不易理解或可读的代码示例,这无助于进一步提出问题可能是:
IWebBrowser2 ie;
CoCreateInstance(CLASS_InternetExplorer, null, CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, IID_WebBrowser2, ie);
ie.AddRef();
ie.Navigate2("about:blank");
IHtmlDocument doc;
dispDoc = ie.Document;
dispDoc.AddRef();
dispDoc.QueryInterface(IHTMLDocument2, doc);
dispDoc.Release()
doc.Write(html);
doc.Close();
doc.Release();
ie.Visible = true;
ie.Release(); …Run Code Online (Sandbox Code Playgroud)