|
This is becouse of Session 0 isolation[^] in Windows Vista and Windows 7. I have made no test about it, but I think that any application opened from a service in Session 0 will also be in Session 0, so you'd get the same result.
|
|
|
|
|
Ahh crap you are right. Did a test:
An unhandled exception of type 'System.ComponentModel.Win32Exception' occurred in System.Drawing.Dll
Additonal Information: The handle is invalid
|
|
|
|
|
I'm parsing IMDb.com pages for movie information and I've come across a problem which I'm not sure how to tackle.
The movie pages of IMDb.com displays the movie titles in your own language and this is my problem - I get titles containing the characters åäöÅÄÖ and they look funny.
A movie called "Som hund och katt: Kitty Galores hämnd" looks like this in the web page source "Som hund och katt: Kitty Galores hämnd" (http://www.imdb.com/title/tt1287468/).
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
I suck at encodings
How to I convert these texts I get from this page so that they look OK in a TextBox control?
|
|
|
|
|
how are you getting the content of such pages? what does your code look like? what are you doing about encoding?
|
|
|
|
|
Problem solved, HttpUtility.HtmlDecode(text)
|
|
|
|
|
You are most likely violating various copyright laws with what you are doing. If you want access to IMDB content you should probably look at the content licensing which starts at $15k per year.
|
|
|
|
|
Actually I don't think they care and honestly I don't care. What I'm doing is grabbing some info from IMDb.com, storing it in a text file that my hardware media player can show when selecting movies. It's nice to see title, plot and rating when choosing what to watch and not just the filename.
|
|
|
|
|
If it is just for a little home project, then I would suggest Gracenote[^] they have licenses for non-commercial use that can get you access to their MusicID and VideoID APIs. That is what the SONY DVD MegaChanger I just bought uses.
|
|
|
|
|
Thanks for the tip - I'll definitely look into that!
|
|
|
|
|
Hello,
I'm using WMI:
ManagementObjectSearcher Search = new ManagementObjectSearcher("Select * From Win32_ComputerSystem");
foreach (ManagementObject Mobject in Search.Get())
{
double Ram_Bytes = (Convert.ToDouble(Mobject["TotalPhysicalMemory"]));
}
and everything is ok, BUT I've 4gb physical installed on my machine, the os uses only 3gb, therefore the amount of ram i get after the code executed is 3gb and not 4...
is there any way to get physical amount and not os usage amount ?
Thanks
|
|
|
|
|
If you read the documentation on the Win32_ComputerSystem[^] class, at the bottom, under the TotalPhysicalMemory property description, you'll see this and the answer to your problem:
TotalPhysicalMemory
Data type: uint64
Access type: Read-only
Qualifiers: Units (Bytes)
Total size of physical memory. Be aware that, under some circumstances, this property may not return an accurate value for the physical memory. For example, it is not accurate if the BIOS is using some of the physical memory. For an accurate value, use the Capacity property in Win32_PhysicalMemory instead.
|
|
|
|
|
Ok,
I tried with "Capacity" as follows :
ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMemory");
foreach (ManagementObject mo in searcher.Get())
{
ulong ans;
ulong.TryParse(mo["Capacity"].ToString(), out ans);
}
after execution i get ans = 2147483648 byte --> 2gb where did those 2 gb come from ?
as i already wrote, my os uses 3gb, but i have 4gb physically installed...
What I mean to
|
|
|
|
|
long ago the Win32 function GlobalMemoryStatus was limited to 2GB; that is why GlobalMemoryStatusEx got introduced.
I'm afraid WMI is still either using GlobalMemoryStatus or having similar trouble.
|
|
|
|
|
Actually, it works fine. Win32_PhysicalMemory returns an object for each memory module, not just one for the entire total.
|
|
|
|
|
Ah, that explains it. I wasn't keen on the idea WMI would be lagging in such a fundamental issue. I should have checked!
I did check now; my 4GB system shows two entries in Win32_MemoryDevice, each with reasonable StartingAddress and EndingAddress.
Thanks.
|
|
|
|
|
Yeah, you should try it on a machine with 128GB of RAM (16 DIMM sockets) and 4 Quad-core Xeons. Very cool!
But then I had to wipe the machine out and rebuild for a VMware ESX server. Even more cool!
|
|
|
|
|
My machines aren't that cool unfortunately.
|
|
|
|
|
Actually, it works fine if you add up all of the Win32_PhysicalMemory objects that are returned:
const long BytesToMBConversion = 1048576;
ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMemory");
long totalMemSize = 0;
foreach (ManagementObject item in searcher.Get)
{
long currentMemSize = Convert.ToInt64(item("Capacity"));
totalMemSize += currentMemSize;
Console.WriteLine("Memory Size: {0} MB", currentMemSize / BytesToMBConversion);
}
Console.WriteLine("Total memory size: {0} MB", totalMemSize / BytesToMBConversion);
|
|
|
|
|
Download the WMI Code Creator:
http://www.microsoft.com/downloads/en/details.aspx?FamilyID=2cc30a64-ea15-4661-8da4-55bbc145c30e&displaylang=en
It lists all WMI classes and you can quick get the values you are wanting. Not only this but you can choose to display/use the code in various different languages. It is a very useful tool when messing with WMI.
Oh btw it says it doesn't support Windows 7 but I use it on Windows 7 without any issues so far.
|
|
|
|
|
This is what I use, based on a Win32 function and P/Invoke:
public static long GetPhysicalRAMSize() {
MEMORYSTATUSEX ms=new MEMORYSTATUSEX();
ms.Length=64;
GlobalMemoryStatusEx(ref ms);
long RAM=ms.TotalPhys;
RAM=(RAM+0x000FFFFF)&0x7FFFFFFFFFF00000L;
return RAM;
}
[DllImport("kernel32.dll")]
public static extern void GlobalMemoryStatusEx(ref MEMORYSTATUSEX ms);
public struct MEMORYSTATUSEX {
public int Length;
public int MemoryLoad;
public long TotalPhys;
public long AvailPhys;
public long TotalPageFile;
public long AvailPageFile;
public long TotalVirtual;
public long AvailVirtual;
public long AvailExtendedVirtual;
}
(together with some using statements).
It reports 3070MB (out of 3072MB) on a 3GB system (Vista/32) and 3957MB (out of 4096MB) on a 4GB system (Win7/64).
|
|
|
|
|
it does exactly what i wrote before, it gets the amount of memory which is used by OS (in my case 3gb out of 4gb i have)
in other words it doesn't do requested job
|
|
|
|
|
I just checked the WMI approach you have, and it works fine for me returning about 3GB and 4GB for two different systems...
|
|
|
|
|
then why i get 2gb instead of 4 ?
another q, is how to get reference to LP_Win32.MEMORYSTATUS ?
Thanks
modified on Wednesday, November 17, 2010 4:44 AM
|
|
|
|
|
Because, as documented, Win32_ComputerSystem is unreliable. It depends on the machines BIOS to be accurate, which some are not.
Use Win32_PhysicalMemory instead. Add up the Capacity values for all of the PhysicalMemory objects returned and you'll get your total system RAM.
|
|
|
|
|
Dave Kreskowiak wrote: Use Win32_PhysicalMemory instead. Add up the Capacity values for all of the PhysicalMemory objects returned and you'll get your total system RAM.
Thanks, it worked, and I get all my 4gb
|
|
|
|