我正在创建一个实用程序库,以便在Web环境中的桌面环境中使用.
它包含我认为在我的应用程序中经常重复的几个功能,包括通过其内容(而不是扩展名)获取文件的mime类型的实用程序.
我必须检查的文件是最常见的(jpg,png,pdf,txt)所以我选择使用外部方法FindMimeFromData(上面的链接)
使用.NET,如何根据文件签名而不是扩展名找到文件的mime类型
该方法运行良好,除了两个不正确的mime类型的JPG(image/pjpg)和PNG(image/x-png),通过在return语句之前进行检查很容易解决.
该库是为平台AnyCPU编译的,因为它必须以32位和64位安装在服务器/客户端上.
在桌面环境测试时,所有为x86和x64编译的应用程序都正常工作.
在测试ASP.NET应用程序(带有用于测试的http处理程序的空站点)时发生类型为HRESULT的错误,并且调试器告诉我它无法提供进一步的信息.
经过一些测试配置,包括将池的身份更改为本地系统(没有结果),我已经确定了问题:
池应该允许32位应用程序(见上图).

为什么?
它不应该加载urlmon.dll我们现在的64位系统的DLL ?
这是一个很大的问题,因为该FindMimeFromData方法可以被任何地方调用到这个库中:
结果是,另一个实用程序方法调用此方法可能会抛出此异常,并且很难通过调试来跟踪问题.
任何想法/经验?
用于测试的操作系统
桌面:
网址:
我正在研究一些旧的 ATL OCX,用作“下载管理器”。它使用URLDownloadToFile API下载文件。
以前,它在网页上作为 ActiveX 托管,因此如果服务器需要身份验证,则由 IE 完成。现在它是可执行文件的一部分,因此它应该负责身份验证。假设用户提供了用户名和密码,我实际上如何进行“身份验证”?我需要支持IIS 的简单 Web 身份验证和NTLM。
对于简单的 Web 身份验证,我发现在 URL 之前传递用户名/密码工作正常。但我不确定这是一种正确的方法。
请指教 谢谢Zaky
如何使用 IHTTPNegotiate 向请求添加额外的标头?我添加了接口,但函数BeginningTransaction & OnResponse永远不会被调用。
TNameSpaceHandler = class(TComObject, IInternetProtocol, IHttpNegotiate)
...
function BeginningTransaction(szURL, szHeaders: LPCWSTR; dwReserved: DWORD;
out szAdditionalHeaders: LPWSTR): HResult; stdcall;
function OnResponse(dwResponseCode: DWORD; szResponseHeaders, szRequestHeaders: LPCWSTR;
out szAdditionalRequestHeaders: LPWSTR): HResult; stdcall;
...
end;
Run Code Online (Sandbox Code Playgroud) 我使用的是FindMimeFromData从urlmon.dll嗅探上传的文件的MIME类型.根据Internet Explorer中的MIME类型检测,image/tiff是一种公认的MIME类型.它在我的开发机器(Windows 7 64位,IE9)上工作正常,但在测试环境(Windows Server 2003 R2 64位,IE8)上不起作用 - 它返回application/octet-stream而不是image/tiff.
上述文章描述采取确定MIME类型的具体步骤,但由于image/tiff是在26种识别的类型中的一种,它应该结束于步骤2(嗅探的实际数据),因此,文件扩展名和注册的应用程序(和其它注册表的东西)不应该.
哦,对了,TIFF文件实际上是在测试服务器上的程序(Windows图片和传真查看器)相关联.并不是Windows注册表中没有对TIFF的任何引用.
任何想法为什么它不能按预期工作?
编辑: FindMimeFromData使用如下:
public class MimeUtil
{
[DllImport("urlmon.dll", CharSet = CharSet.Unicode, ExactSpelling = true, SetLastError = false)]
private static extern int FindMimeFromData(
IntPtr pBC,
[MarshalAs(UnmanagedType.LPWStr)] string pwzUrl,
[MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.I1, SizeParamIndex = 3)] byte[] pBuffer,
int cbSize,
[MarshalAs(UnmanagedType.LPWStr)] string pwzMimeProposed,
int dwMimeFlags,
out IntPtr ppwzMimeOut,
int dwReserved);
public static string GetMimeFromData(byte[] …Run Code Online (Sandbox Code Playgroud) 我想制作从互联网上下载页面的程序并对其进行一些解析.第二部分很容易,问题是第一部分.
我想使用URLDownloadToFile()函数.但默认情况下,它不会等待完成下载.MSDN说最后一个参数是一种回调函数,但是我找不到任何关于如何使用它的信息(当它被调用时它必须做什么,甚至它是什么类型的函数).有人可以解释我最后一个参数是什么以及如何使用它(在C++中)让我的应用程序等待?
我知道这已经被问过很多次了,但不幸的是我没有找到解决我的问题的方法,我正在使用urlmon.dll从字节数组中查找 MIME 类型,但我收到了 IIS 进程的崩溃w3wp.exe
尝试读取或写入受保护的内存。这通常表明其他内存已损坏。
编码:
public static int MimeSampleSize = 256;
public static string DefaultMimeType = "application/octet-stream";
[DllImport(@"urlmon.dll", CharSet = CharSet.Auto)]
private extern static uint FindMimeFromData(
uint pBC,
[MarshalAs(UnmanagedType.LPStr)] string pwzUrl,
[MarshalAs(UnmanagedType.LPArray)] byte[] pBuffer,
uint cbSize,
[MarshalAs(UnmanagedType.LPStr)] string pwzMimeProposed,
uint dwMimeFlags,
out uint ppwzMimeOut,
uint dwReserverd
);
public static string GetMimeFromBytes(byte[] data)
{
try
{
uint mimeType;
FindMimeFromData(0, null, data, (uint)MimeSampleSize, null, 0, out mimeType, 0);
var mimePointer = new IntPtr(mimeType);
var mime = Marshal.PtrToStringUni(mimePointer); …Run Code Online (Sandbox Code Playgroud) 如何IServiceProvider在我继承其他接口的类中实现,以便实际调用它们的方法?现在我总是E_NOINTERFACE回来QueryInterface.
TPassthrough = class(TComObject, IInternetProtocolRoot, IInternetProtocolSink, IInternetProtocol, IServiceProvider)
private
FDefaultSink: IInternetProtocol;
FProtSink: IInternetProtocolSink;
FBindInfo: IInternetBindInfo;
public
{ IServiceProvider }
function QueryService(const rsid, iid: TGuid; out Obj): HResult; stdcall;
{ IInternetProtocolSink }
function Switch(const ProtocolData: TProtocolData): HResult; stdcall;
function ReportProgress(ulStatusCode: ULONG; szStatusText: LPCWSTR): HResult; stdcall;
function ReportData(grfBSCF: DWORD; ulProgress, ulProgressMax: ULONG): HResult; stdcall;
function ReportResult(hrResult: HResult; dwError: DWORD; szResult: LPCWSTR): HResult; stdcall;
{ IInternetProtocolRoot }
function Start(szUrl: LPCWSTR; OIProtSink: IInternetProtocolSink; OIBindInfo: IInternetBindInfo; grfPI, dwReserved: DWORD): …Run Code Online (Sandbox Code Playgroud) 我使用URLDownloadToFile在Delphi中下载文件.在url中没有文件的真实名称.是否可以仅指定文件的路径,保留默认名称,即资源管理器显示?
urlmon ×8
c# ×3
delphi ×3
c++ ×2
32bit-64bit ×1
bho ×1
com ×1
delphi-xe4 ×1
delphi-xe7 ×1
dllimport ×1
download ×1
iis ×1
mime ×1
mime-types ×1
ntlm ×1
twebbrowser ×1
winapi ×1