我有一个MFC对话框窗口,我在其中添加了一个WebBrowser控件(封装了Internet Explorer引擎).
下面的代码的目标是到说的内容渲染web browser control成一个device context,我以后可以用于打印:
//MFC code, error checks are omitted for brevity
//'m_browser' = is a web browser control of type `CExplorer1`
IDispatch* pHtmlDoc = m_browser.get_Document();
CComPtr<IHTMLDocument2> pHtmlDocument2;
pHtmlDoc->QueryInterface(IID_IHTMLDocument2, (void**)&pHtmlDocument2));
//Get IViewObject2 for the entire document that we will use to render into a DC
CComPtr<IViewObject2> pViewObject;
pHtmlDocument2->QueryInterface(IID_IViewObject2, (void **)&pViewObject));
CComPtr<IHTMLElement> pBody;
pHtmlDocument2->get_body(&pBody));
CComPtr<IHTMLElement2> pBody2;
pBody->QueryInterface(IID_IHTMLElement2, (void **)&pBody2));
//Get default printer DC
CPrintDialog pd(TRUE, PD_ALLPAGES | PD_USEDEVMODECOPIES | PD_NOPAGENUMS | …Run Code Online (Sandbox Code Playgroud) 我正在检查使用最新版本的 VS 2017 C++ 编译器完成的项目的发布版本。我很好奇为什么编译器选择构建以下代码片段:
//ncbSzBuffDataUsed of type INT32
UINT8* pDst = (UINT8*)(pMXB + 1);
UINT8* pSrc = (UINT8*)pDPE;
for(size_t i = 0; i < (size_t)ncbSzBuffDataUsed; i++)
{
pDst[i] = pSrc[i];
}
Run Code Online (Sandbox Code Playgroud)
像这样:
UINT8* pDst = (UINT8*)(pMXB + 1);
UINT8* pSrc = (UINT8*)pDPE;
for(size_t i = 0; i < (size_t)ncbSzBuffDataUsed; i++)
00007FF66441251E 4C 63 C2 movsxd r8,edx
00007FF664412521 4C 2B D1 sub r10,rcx
00007FF664412524 0F 1F 40 00 nop dword ptr [rax]
00007FF664412528 0F 1F 84 00 00 00 00 …Run Code Online (Sandbox Code Playgroud) 有人可以让我知道我在这里做错了什么吗?
MFC 项目,我用来CFileDialog让用户选择多个文件,如下所示:
CFileDialog fd(TRUE, NULL, NULL,
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_EXPLORER | OFN_ALLOWMULTISELECT,
NULL, this);
if(fd.DoModal() == IDOK)
{
//Multi-selection
CString strPaths;
POSITION fileNamesPosition = fd.GetStartPosition();
while(fileNamesPosition != NULL)
{
if(!strPaths.IsEmpty())
strPaths += L"\n";
strPaths += fd.GetNextPathName(fileNamesPosition);
}
AfxMessageBox(strPaths);
}
Run Code Online (Sandbox Code Playgroud)
所以如果说的话,有两个快捷方式文件:
shortcut_1.lnk文件指的是:"D:\Folder\Project_B\Release\Name of Project B.exe"
shortcut_2.lnk这指的是"D:\Folder\Project_A\Release\Name of Project A.exe"
如果我从上面代码生成的“文件打开”对话框中选择它们,我的结果strPaths将变为以下内容,这是不正确的:
D:\Folder\Project_A\Release\Name of Project A.exe
D:\Folder\Project_A\Release\Name of Project B.exe
Run Code Online (Sandbox Code Playgroud)
第二条路是错误的!
我正在尝试显示使用 SwiftUI 编写的 macOS GUI 应用程序中的文件选择器窗口。所以我称之为:
let panel = NSOpenPanel()
//panel.allowedFileTypes = ["myext"] //I get a warning here that it's deprecated
//Trying to use the following instead:
let fileType = UTType(tag: "myext", tagClass: .filenameExtension, conformingTo: nil)
if(fileType != nil)
{
panel.allowedContentTypes = [fileType!]
}
else
{
assert(false)
}
panel.allowsMultipleSelection = false
panel.canChooseDirectories = false
panel.canChooseFiles = true
let resp = panel.runModal()
Run Code Online (Sandbox Code Playgroud)
面板已显示,但我无法选择任何文件,包括带有我的.myext扩展名的文件。
但如果我取消注释panel.allowedFileTypes行,一切都会按我的预期进行。
那么我做错了什么allowedContentTypes?
附言。或者,至少如何在 Swift 中消除该已弃用的警告?(allowedFileTypes效果很好,弃用它有什么意义!)
这是一个奇怪的问题,让我试着解释一下.我在c ++/MFC中编写了一个(基于对话框的)应用程序,支持拖放功能.
我在Windows 7上使用默认主题进行以下测试.我的应用程序正在屏幕上运行.它不是顶部窗口(按其z顺序)或换句话说它被其上面的其他窗口遮挡.
如果我开始从Chrome或Firefox网络浏览器中拖动链接或只是文本选择,首先进入任务栏上我的应用程序图标,图标会闪烁,我的应用程序会弹出屏幕(通过接收顶部的z顺序),所以我然后可以拖放到我的应用程序中.一切正常.
如果我从IE 9(版本9.0.8112,更新版本9.0.12)执行相同的操作,当我将所选文本或链接首先拖动到我的应用程序的任务栏图标,以使我的应用程序成为顶部窗口(按z顺序),应用程序图标继续闪烁,但它从未在屏幕上显示,就像Chrome或FF一样,因此我不得不放弃我的拖放.
知道为什么它会像IE一样发生,如果有办法解决它?
编辑:以下是我的评论的代码示例:
HRESULT __stdcall DragEnter(IDataObject* pDataObject, DWORD grfKeyState, POINTL pt, DWORD* pdwEffect)
{
//IDropTarget::DragEnter
m_fAllowDrop = QueryDataObject(pDataObject);
if(m_fAllowDrop)
{
//SUCCESS
// get the dropeffect based on keyboard state
}
else
{
//FAILURE
*pdwEffect = DROPEFFECT_NONE;
}
return S_OK;
}
BOOL QueryDataObject(IDataObject* pDataObject, int* pnOutDataType)
{
static FORMATETC fmtetc_file = {CF_HDROP, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
static FORMATETC fmtetc_txt = {CF_UNICODETEXT, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
BOOL bRes = FALSE;
HRESULT hr;
//See if our …Run Code Online (Sandbox Code Playgroud) 我的任务很简单:我需要在开发机器上的64位环境中测试我的ASP.NET Web应用程序.(此时我甚至没有询问是否通过调试器运行它.我只需要在64位进程中运行它.)
所以我在Visual Studio 2010中创建了一个库存C#Web应用程序并调整其属性:

然后我做了Ctrl + F5(或运行没有调试)和IE加载并挂起如下:

我在这做错了什么?
PS.在Windows 7旗舰版(64位)上运行它.
通过在HTML中使用此技术,曾经有一种很好的方式来判断Web浏览器是否为IE:
<!--[if IE]>
Non-IE browsers ignore this
<![endif]-->
Run Code Online (Sandbox Code Playgroud)
要么
<!--[if !IE]-->
IE ignores this
<!--[endif]-->
Run Code Online (Sandbox Code Playgroud)
但这在IE 10 中不再起作用.
不知道该用什么代替从其他网络浏览器(使用HTML或JavaScript)告诉IE?
PS.我需要能够从非IE网络浏览器告诉任何版本的IE.
html javascript internet-explorer conditional-comments internet-explorer-10
我从使用C#编写的Windows服务调用以下代码:
try
{
ServerManager m = new ServerManager();
if(m != null)
{
SiteCollection sites = m.Sites; //I get exception here
}
}
catch (Exception ex)
{
}
Run Code Online (Sandbox Code Playgroud)
我得到这个例外:
{"文件名:redirection.config\r \n错误:无法读取配置文件\ r \n\r \n":null}
那是什么意思?是否有任何方法可以m在它被抛出之前在ServerManager或我的变量中预测它?
我在C#代码中一直在做以下事情:
#if DEBUG
//Debugger only code
#endif
Run Code Online (Sandbox Code Playgroud)
但出于某种原因,当我在我的C#控制台应用程序(在VS 2010中构建为Windows服务)中执行相同操作时,它似乎不起作用,并且对于Release和Debug配置,它看起来似乎DEBUG没有定义.
我是否需要为该预处理器常量设置一些工作?
我试图弄清楚如何在C#中使用模板。我这样写:
public static List<TValue> deepCopyList<TValue>(List<TValue> src)
{
List<TValue> arr = new List<TValue>();
for (int i = 0; i < src.Count; i++)
{
arr.Add(new TValue(src[i])); //Error on this line
}
return arr;
}
Run Code Online (Sandbox Code Playgroud)
但是我得到一个错误:
错误CS0304:无法创建变量类型'TValue'的实例,因为它没有new()约束