July 18th, 2008, 12:31 PM
Problem using FindMimeFromData function
I'm getting a casting error using the code below. The error on the web page (when you click the error icon) is:
Sys.WebForms.PageRequestManagerServerErrorExceptio n: Conversion from string "application.msword" to type "Long" is not valid.
It's to do with declaring the mimeout integer pointer to the "<MarshalAs(UnmanagedType.LPWStr)> ByRef ppwzMimeOut As String" value in the function call.
If I change mimeout declaration to: "Dim mimeout as string" and return that and comment out the other mimeout referenced code it returns "application/msword" correctly but obviously the rest of the function won't work because there is no pointer to the original referenced mimeout address.
Has anyone got any ideas of what I'm doing wrong?
Public Declare Function FindMimeFromData Lib "urlmon.dll" (ByVal pBC As IntPtr, <MarshalAs(UnmanagedType.LPWStr)> ByVal pwzUrl As String, <MarshalAs(UnmanagedType.LPArray, ArraySubType:=UnmanagedType.I1, SizeParamIndex:=3)> ByVal pBuffer As Byte(), ByVal cbSize As Integer, <MarshalAs(UnmanagedType.LPWStr)> ByVal pwzMimeProposed As String, ByVal dwMimeFlags As Integer, <MarshalAs(UnmanagedType.LPWStr)> ByRef ppwzMimeOut As String, ByVal dwReserved As Integer) As Integer
Public Shared Function getMimeFromFile(ByVal file As String) As String
Dim mimeout As IntPtr
If Not System.IO.File.Exists(file) Then
Throw New FileNotFoundException(file + " not found")
Dim MaxContent As Integer = CInt(New FileInfo(file).Length)
If MaxContent > 4096 Then
MaxContent = 4096
Dim fs As New FileStream(file, FileMode.Open)
Dim buf(MaxContent) As Byte
fs.Read(buf, 0, MaxContent)
Dim result As Integer = FindMimeFromData(IntPtr.Zero, file, buf, MaxContent, Nothing, 0, mimeout, 0)
If result <> 0 Then
Dim mime As String = Marshal.PtrToStringUni(mimeout)
July 22nd, 2008, 10:17 AM
Can nobody help me with this?
I've posted the same question in six forums and no-one seems to know what I've done wrong in my coding. I'm sure it's a simple case of using the wrong variable type either in the function or pointer declaration but for the life of me I don't know where!
July 24th, 2008, 06:07 AM
I've finally fixed this by using "<MarshalAs(UnmanagedType.U4)> ByRef ppwzMimeOut As Integer" in the function declare.. but I don't really understand why it works, probably because I don't really understand the way MarshalAs works either. But at least it works!
July 24th, 2008, 09:01 AM
I don't know either, anyway thanks for sharing the solution here.
Originally Posted by deniseaddy