|
I am developing an addin for AutoCAD using c# with a WPF xaml dockable pane, I would like to sometimes show a webpage in the pane so I am using the WebBrowser, however it is not displaying the HTML5 content well as it defaults to IE7. using FEATURE_BROWSER_EMULATION I should be able to point it to using IE11 if installed, however setting the application that the addin is loaded into in the registry isnt working. I also tried the dll file that my addin creates and this doesnt work either. Is there a way to tell my WebBrowser in my dll within acad.exe to use IE11?
|
|
|
|
|
CodeProject is your friend: "Configuring the emulation mode of an Internet Explorer WebBrowser control" July, 2014: [^].
However, the fact you have such a complex embedding scenario, AutoCad/Add-In/WPF/WebBrowser, could be a constraining factor here, I would guess (and, I'll never know because I don't have AutoCad).
«A man will be imprisoned in a room with a door that's unlocked and opens inwards ... as long as it does not occur to him to pull rather than push» Wittgenstein
|
|
|
|
|
Thanks for the reply Bill, I just found that if I put the registry entry onto the HKEY_CURRENT_USER instead of HKEY_LOCAL_MACHINE it works, so I am a happy boy!
|
|
|
|
|
Glad you got it working. You might consider adding a Tip/Trick to CodeProject describing the problem, how you fixed it, and ... if the CP article did help you ... cite it.
cheers, Bill
«A man will be imprisoned in a room with a door that's unlocked and opens inwards ... as long as it does not occur to him to pull rather than push» Wittgenstein
|
|
|
|
|
The current search i have implemented into my program is limited to specific tables in the database. How do i go about adding the capabilities of searching all the tables within a database? In addition i would like to offer filters using check boxes to narrow the search parameters.
A JOIN would allow the search across multiple tables but the following line of code limits the search because of the "TestDescription='"
DataRow[] returnRows = DS.Tables[0].Select("TestDescription='" + search + "'");
I have provided my code below:
private void BtnSearch_Click(object sender, RoutedEventArgs e)
{
string ConnectionString = "Data Source=RATTLERR;Initial Catalog=medical;Integrated Security=True;";
SqlConnection conn = new SqlConnection(ConnectionString);
SqlDataAdapter dAdapter = new SqlDataAdapter("Select * FROM test", conn);
conn.Open();
DataSet DS = new DataSet();
string search = tbSearch.Text;
int result = 0;
if (tbSearch.Text.Length >= 1)
{
dAdapter.Fill(DS);
DataRow[] returnRows = DS.Tables[0].Select("TestDescription='" + search + "'");
result = returnRows.Length;
if (result > 0)
{
dgInfo.ItemsSource = returnRows.CopyToDataTable().DefaultView;
}
else
{
System.Windows.MessageBox.Show("No Records Found");
}
conn.Close();
}
}
modified 3-Jan-15 14:06pm.
|
|
|
|
|
|
Thank you for the information i will give it a try and see how it turns out..
|
|
|
|
|
Hi everyone,
I'm facing a problem while sending bulk mails with multiple attachments.
I could send mails to everyone but only the first recipient was able to receive the attachments and rest of the recipients could receive the emails with malfunctioning attachment.
error from the second recipients gmail when I checked it out - Quote: Whoops!
There was a problem displaying this image.
Retrying...
Thanks in advance.
|
|
|
|
|
That is not a question that can be answered here. You need to get that recipient to investigate exactly what happened, or to get you a copy of the raw message data.
|
|
|
|
|
Hello,
I'm trying to email images to my tumblr blog. I can go into my live account, create an email, attach an image and send it -- this works fine and post to my tubmlr blog fine. However, when I try to to do the same thing in my C# application nothing happens, no error, and nothing post to tumblr. I was hoping somebody could give me some insight as to what live.com does differently than me when sending email. My code is below, thanks in advanced.
SmtpClient smtpClient = new SmtpClient();
NetworkCredential basicCredential = new NetworkCredential("myliveaccount@live.com", "mylivepass");
MailMessage message = new MailMessage();
MailAddress fromAddress = new MailAddress("myliveaccount@live.com");
smtpClient.Host = "smtp.live.com";
smtpClient.UseDefaultCredentials = false;
smtpClient.Credentials = basicCredential;
smtpClient.Timeout = (60 * 5 * 1000);
smtpClient.EnableSsl = true;
message.From = fromAddress;
message.Subject = "subject";
message.IsBodyHtml = false;
message.Body = "#Tag1 #Tag2 #Tag3 #Tag4";
message.To.Add("tumblrblogemail@tumblr.com");
string attachmentFilename = @"C:\0103150633034149.jpg";
Attachment attachment = new Attachment(attachmentFilename, MediaTypeNames.Application.Octet);
ContentDisposition disposition = attachment.ContentDisposition;
disposition.CreationDate = File.GetCreationTime(attachmentFilename);
disposition.ModificationDate = File.GetLastWriteTime(attachmentFilename);
disposition.ReadDate = File.GetLastAccessTime(attachmentFilename);
disposition.FileName = Path.GetFileName(attachmentFilename);
disposition.Size = new FileInfo(attachmentFilename).Length;
disposition.DispositionType = DispositionTypeNames.Attachment;
message.Attachments.Add(attachment);
smtpClient.Send(message);
|
|
|
|
|
try by adding ssl port
smtpClient.Port = 587;
|
|
|
|
|
Hey, thanks for replying. yup, I tried that, same results...
Some how or another, Tumblr knows the difference between hotmail and an application using Hotmail smtp. I can't for the life of me figure out what it is though.
|
|
|
|
|
You should check the required settings for email access. Login to your hotmail account and use the help system.
|
|
|
|
|
Interesting, so it works if I don't attach the photo.....
|
|
|
|
|
Which suggests that your attachment is causing a problem.
|
|
|
|
|
How big, in bytes, is your attachment after being Base64 encoded?
|
|
|
|
|
What do you mean? The above code is all I do. It's the same image I use in my email web client (like hotmail.com).
|
|
|
|
|
Most email systems put a limit on the size of attachments. If the combined size, after converting the binary attachments to a Base64 string, of the email subject, body and encoded attachments exceed a certain limit, the email is not sent.
Every place I've ever worked has a 10MB limit on attachments.
If you're using the hotmail servers, the last I heard that limit is 50MB per attachment.
|
|
|
|
|
Oh, thanks, but it's way under that. I can send the picture just fine using Hotmail, it's only when I try to use Hotmail SMTP via C# that it fails.
|
|
|
|
|
Hello
I figured this out for all that may be interested. You have to set the attachment content type to "image/jpeg".
Thanks everyone.
|
|
|
|
|
I am having trouble with DeviceIoControl() and control code FSCTL_ENUM_USN_DATA and I am also having difficulties understanding the documentation for FSCTL_ENUM_USN_DATA.
I created the structs for MFT_ENUM_DATA and USN_RECORD_V3 and passed them as I understood the documentation, as pointers.
However, the first and only USN record I get in return (the values of the USN_RECORD_V3 buffer) is only garbage. Also, the outBufferSize should be 555 (explained at the doc for USN_RECORD_V3), but if I exceed 175 bytes, I get a System.AccessViolationError .
How to calculate outBufferSize :
MaximumChangeJournalRecordSize =
( (MaximumComponentLength - 1) * sizeof(WCHAR)
+ sizeof(USN_RECORD_V3) );
I would appreciate if you could help me finding the mistake in my code or in my thought process. In advance, a lot of thanks to you guys!
Edit: Problematic code starts below comment:
Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using Microsoft.Win32.SafeHandles;
using FILETIME = System.Runtime.InteropServices.ComTypes.FILETIME;
public class Win32
{
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct USN_JOURNAL_DATA_V0
{
public UInt64 UsnJournalId;
public Int64 FirstUsn;
public Int64 NextUsn;
public Int64 LowestValidUsn;
public Int64 MaxUsn;
public UInt64 MaximumSize;
public UInt64 AllocationDelta;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct USN_JOURNAL_DATA_V1
{
public UInt64 UsnJournalId;
public Int64 FirstUsn;
public Int64 NextUsn;
public Int64 LowestValidUsn;
public Int64 MaxUsn;
public UInt64 MaximumSize;
public UInt64 AllocationDelta;
public UInt16 MinSupportedMajorVersion;
public UInt16 MaxSupportedMajorVersion;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct USN_RECORD_V3
{
public UInt32 RecordLength;
public UInt16 MajorVersion;
public UInt16 MinorVersion;
public Byte FileReferenceNumber;
public Byte ParentFileReferenceNumber;
public Int64 Usn;
public FILETIME TimeStamp;
public UInt32 Reason;
public UInt32 SourceInfo;
public UInt32 SecurityId;
public UInt32 FileAttributes;
public UInt16 FileNameLength;
public UInt16 FileNameOffset;
public Char FileName;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct MFT_ENUM_DATA_V1
{
public UInt64 StartFileReferenceNumber;
public Int64 LowUsn;
public Int64 HighUsn;
public UInt16 MinMajorVersion;
public UInt16 MaxMajorVersion;
}
[DllImport("kernel32.dll", ExactSpelling = true, SetLastError = true, CharSet = CharSet.Auto)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool DeviceIoControl(
SafeHandle hDevice,
UInt32 dwIoControlCode,
IntPtr lpInBuffer,
UInt32 nInBufferSize,
out IntPtr lpOutBuffer,
UInt32 nOutBufferSize,
out UInt32 lpBytesReturned,
IntPtr lpOverlapped
);
[DllImport("kernel32.dll", ExactSpelling = true, SetLastError = true, CharSet = CharSet.Auto)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool DeviceIoControl(
SafeHandle hDevice,
UInt32 dwIoControlCode,
IntPtr lpInBuffer,
UInt32 nInBufferSize,
out USN_JOURNAL_DATA_V1 lpOutBuffer,
UInt32 nOutBufferSize,
out UInt32 lpBytesReturned,
IntPtr lpOverlapped
);
[DllImport("kernel32.dll", ExactSpelling = true, SetLastError = true, CharSet = CharSet.Auto)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool DeviceIoControl(
SafeHandle hDevice,
UInt32 dwIoControlCode,
ref MFT_ENUM_DATA_V1 lpInBuffer,
UInt32 nInBufferSize,
out USN_RECORD_V3 lpOutBuffer,
UInt32 nOutBufferSize,
out UInt32 lpBytesReturned,
IntPtr lpOverlapped
);
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern SafeFileHandle CreateFile(
string lpFileName,
uint dwDesiredAccess,
uint dwShareMode,
IntPtr lpSecurityAttributes,
uint dwCreationDisposition,
uint dwFlagsAndAttributes,
IntPtr hTemplateFile
);
[DllImport("kernel32.dll")]
public static extern void ZeroMemory(IntPtr ptr, int size);
}
namespace UsnTest01
{
class Program
{
#region constants
public const short FILE_ATTRIBUTE_NORMAL = 0x80;
public const short INVALID_HANDLE_VALUE = -1;
public const UInt32 GENERIC_READ = 0x80000000;
public const UInt32 GENERIC_WRITE = 0x40000000;
public const UInt32 FILE_SHARE_READ = 0x00000001;
public const UInt32 FILE_SHARE_WRITE = 0x00000002;
public const UInt32 CREATE_NEW = 1;
public const UInt32 CREATE_ALWAYS = 2;
public const UInt32 OPEN_EXISTING = 3;
private const UInt32 FILE_DEVICE_FILE_SYSTEM = 0x00000009;
private const UInt32 METHOD_NEITHER = 3;
private const UInt32 METHOD_BUFFERED = 0;
private const UInt32 FILE_ANY_ACCESS = 0;
private const UInt32 FILE_SPECIAL_ACCESS = 0;
private const UInt32 FILE_READ_ACCESS = 1;
private const UInt32 FILE_WRITE_ACCESS = 2;
public const UInt32 FSCTL_QUERY_USN_JOURNAL = (FILE_DEVICE_FILE_SYSTEM << 16) | (FILE_ANY_ACCESS << 14) | (61 << 2) | METHOD_BUFFERED;
public const UInt32 FSCTL_ENUM_USN_DATA = (FILE_DEVICE_FILE_SYSTEM << 16) | (FILE_ANY_ACCESS << 14) | (44 << 2) | METHOD_NEITHER;
public const UInt32 FSCTL_READ_USN_JOURNAL = (FILE_DEVICE_FILE_SYSTEM << 16) | (FILE_ANY_ACCESS << 14) | (46 << 2) | METHOD_NEITHER;
#endregion constants
static void Main(string[] args)
{
SafeFileHandle handleValue = null;
handleValue = Win32.CreateFile(
@"\\.\C:",
GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
IntPtr.Zero,
OPEN_EXISTING,
0,
IntPtr.Zero);
if (handleValue.IsInvalid)
{
Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error());
}
Win32.USN_JOURNAL_DATA_V1 ujd = new Win32.USN_JOURNAL_DATA_V1();
uint lpBytesReturned;
bool retJournalId = Win32.DeviceIoControl(
handleValue,
FSCTL_QUERY_USN_JOURNAL,
IntPtr.Zero,
0,
out ujd,
(uint)Marshal.SizeOf(ujd),
out lpBytesReturned,
IntPtr.Zero);
Console.WriteLine("Wert ist " + ujd.UsnJournalId.ToString("X4"));
Win32.USN_RECORD_V3 usnRecordV3;
Win32.MFT_ENUM_DATA_V1 mftEnumDataV1 = new Win32.MFT_ENUM_DATA_V1 { StartFileReferenceNumber = 0 };
uint outBufferSize = (uint)((255 - 1) * sizeof(Char) + Marshal.SizeOf(typeof(Win32.USN_RECORD_V3)));
lpBytesReturned = 0;
bool retUsnData = false;
while (retUsnData != true)
{
retUsnData = Win32.DeviceIoControl(
handleValue,
FSCTL_ENUM_USN_DATA,
ref mftEnumDataV1,
(uint)Marshal.SizeOf(mftEnumDataV1),
out usnRecordV3,
175,
out lpBytesReturned,
IntPtr.Zero);
}
int r1 = Marshal.GetLastWin32Error();
int r2 = Marshal.GetHRForLastWin32Error();
if (retUsnData == false)
{
Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error());
}
}
}
}
|
|
|
|
|
The documentation for the output buffer states:
Mandelnuss wrote:
lpOutBuffer
A pointer to the output buffer that receives a USN followed by zero or more USN_RECORD_V2 or USN_RECORD_V3 structures.
The USN is a DWORDLONG value that represents the USN following the last record in the buffer. It can be used in a subsequent call to FSCTL_ENUM_USN_DATA to get the next set of records following those in the current output buffer.
Whereas your code is expecting just a USN_RECORD_V3. You need to add the extra space at the beginning.
|
|
|
|
|
Wow, okay. I did not quite understand that part, thank you. So what I am getting is one USN and as many complete USN records as fit in the buffer? So using a struct is the wrong approach, right?
What variable type would I point to in this case? A byte-array? Or is there something better?
|
|
|
|
|
The item at the beginning is a DWORDLONG (64 bits)[^], so you need to add that to the beginning of your structure definition. You also need to expand the structure at the end to allow for variable data in the final item. In a Win32 structure definition, when you see something like:
...
WORD FileNameOffset;
WCHAR FileName[1];
} USN_RECORD_V3, *PUSN_RECORD_V3;
the FileName (last) field is indicating that it is actually of unknown length, rather than a single character, so you should reserve as much space as is expected for your results. It is better to have more space in your structure than you need, but as long as it is at least the same size as indicated in the bufferlength variable, it should work.
|
|
|
|
|
Thank you so much for your help so far. I could do much progress based on your replies!
I understand that the buffer will contain the DWORDLONG, the USN_RECORD_V3 and a variable sized string (FileNameLength bytes minus the first char) in this order.
The call will return more than one USN record. While I would love to use something like this
public struct OUTBUFF{
public ulong usn; // 8 byte
public USN_RECORD_V3 usnRecordV3; // 47 byte
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 508)]
public byte[] fileName; // max 508
}
succeeding records would be written in OUTBUFF.fileName . A solution would be to just have a byte array for all returned USN records
<pre lang="sql">public struct OUTBUFF{
public ulong usn; // 8 byte
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 555)]
public byte[] recordData; // max 508+47
}</pre>
and then manually split the OUTBUFF.recordData at the offsets calculated by USN_RECORD_V3.RecordLength
While this would not be difficult to write, do you maybe know of a better way to handle this? I am still new to the matter and keen on learning good ways of working with that stuff.
|
|
|
|
|