|
You actually should stick with a struct to keep it allocated on the stack as opposed to taking the risk that an instance of it will be kept in the heap. Who knows what problems this could cause with the unmanaged code.
There are plenty of ways to convert structs to pointers and pointers to structs (after all, a buffer begins with a pointer and is a certain size). If you review all the methods of the Marshal class, there are several methods to get you exactly what you need, such as Marshal.UnsafeAddrOfPinnedArrayElement , which wraps the unsafe code in a trusted assembly (a base class library assembly) and returns you an IntPtr . If the method takes an address of a struct, you should be able to pass an array of that struct (without a ref since an array is a reference type already). When you get it back, you can either treat the array as-is or use the aforementioned method.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
I have a Panel with AutoScroll set to true and when using the mouse to move the scroll bar the Panel position is updated only when the mouse button is released. How can I make the panel scroll while holding down the mouse button and moving the scroll bar?
|
|
|
|
|
Works fine for me in both .NET 1.0 and 1.1. Are you sure you're using the System.Windows.Forms.Panel from the .NET base class libraries?
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Yes, I am using System.Windows.Forms.Panel but I have not set up any events to specifically react on the scrollbar moving, is that necesssary? The funny thing is that it works fine when using the mouse wheel to scroll just not when clicking on the scroll bar, holding down left mouse button and moving the mouse. Any other ideas to what can cause this?
|
|
|
|
|
There are no events for a such control exposed by classes derived from ScrollableControl . In fact, the only way to know when something is being scrolled is to override WndProc and handy notification window messages the "old fashion way" (if you've done any Win32 programming, I'm sure you'll understand).
What version of .NET are you using? Scrolling should work just fine in any event. I've tried in 1.1 just now (our application at work is still 1.0 and it works correctly) and it works for keyboard and mouse events both (i.e., it continuously scrolls). Any other conditions you think are worth mentioning (like performing owner draw or something)?
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
I have a COM method that requires a GUID to the interface used by a particular Item.
I'm not sure how to get the GUID via c# (I can look it up in shell32 though), or how to convert it to a COM syntax when I have it.
I've checked the net, but there is almost nothing on this subject.
So how do i pass a GUID from C# to COM? C# handles it as a string... is this how I should proceed?
Cheers
Cata
|
|
|
|
|
See the System.Guid structure, which marshals to the GUID structure in C/C++. This even has methods for creating an instance of the Guid struct from a string.
BTW, COM is not a syntax - it's a programming concept. GUIDs can be expressed in many different ways, from a nested array of bytes to a string. Since both are typically in hex form, this is trivial to translate.
And if you're wanting to use a GUID from an attributed interface already declared, you can use Marshal.GenerateGuidForType to get the GUID (or to generate one if a Type is not attributed with the GuidAttribute ).
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
I'm trying to call the following line of code:
Guid myGUID = Marshal.GenerateGuidForType(System.Type.GetType("IShellFolder"));<br />
But I always end up with a null pointer and an exception. The type ISHellFolder is defined as:
<br />
[Guid("000214E6-0000-0000-C000-000000000046"),<br />
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] <br />
interface IShellFolder<br />
{<br />
...<br />
...<br />
}<br />
Not entirely sure why it's not working.
Cata
|
|
|
|
|
The Catalyst wrote:
Guid myGUID = Marshal.GenerateGuidForType(System.Type.GetType("IShellFolder"));
But I always end up with a null pointer and an exception.
Thats becos Type.GetType() requires a fully qualified assembly name, hence returning null and causing your exception.
leppie::AllocCPArticle("Zee blog"); Seen on my Campus BBS: Linux is free...coz no-one wants to pay for it.
|
|
|
|
|
Type.GetType requires a fully-qualified class name (includes namespace) and assembly name if defined in a different assembly (and, optionally, other Type information). That's the first thing wrong with it.
I also mentioned previously in this thread to use typeof when you know the type at design-time.
Guid guid = Marshal.GenerateGuideForType(typeof(IShellFolder)); Did you even look at the documentation for Type.GetType ? You really need to start reading the .NET Framework SDK documentation and pick up a book like I gave you a link for before on COM interoperability with .NET, although this particular question is just a fundamental type issue with the .NET Framework (using C# syntax).
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
I have not got books, but I do have many articles, tutorials, and the SDK which I am working through. While I understand the use of books, I find I have trouble working from them. To be honest, the only thing i've read on programming was the first 40 pages of a Java book. Beyond that i've learned everything myself, C#, HTML etc.
I was unaware of 'typeof', i'm sure i'll use it in the future. However, I still have a problem with my function SHBindToParent.
As for my problem with COM that this question derived from. I wasn't marshaling the GUID as a structure:
[MarshalAs(UnmanagedType.LPStruct)]
Once this was done, It worked fine.
As always your help is much appreciated.
Cata
|
|
|
|
|
|
Is it possible to create an instance of an object that has been passed through as a method parameter with a ref keyword ?
public class BasicClass{...}
public class NewClass: BasicClass{...}
...
Something(ref NewClass)
...
public BasicClass Something(ref BasicClass aclass)
{
return new aclass();
}
Regards, Desmond
|
|
|
|
|
You should look at making a class factory. In particular you should look at Reflection and the Activator.CreateInstance() method.
- Nick Parker My Blog
|
|
|
|
|
Something like
return (BasicClass)Activator.CreateInstance(aclass.GetType()); should work.
Charlie
if(!curlies){ return; }
|
|
|
|
|
Could BasicClass implement ICloneable so that in method Something, you return aclass.Clone() ?
|
|
|
|
|
I'm not going to answer your question since the three people above did, but I did want to comment on your use of the ref keyword: it isn't necessary! An instance of a class is already a reference. There is no need to declare the parameter as a ref parameter and this can actually lead to problems with regard to marshaling.
See Value vs Reference Types in C#[^] (for all of .NET, actually) for more information.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
|
For example, when marshaling to a native function via P/Invoke you actually end up passing a pointer to a pointer.
This also creates memory overhead both in the same AppDomain and when marshaling to different AppDomains.
Just understand that there are reference types and value types. A reference type is just that - a reference. You don't need to ref it unless you need to pass a double-pointer. This is all discussed in the .NET Framework as well and is fundamental in programming for the .NET Framework.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Hi,
I want to create these attributes dynamically in a datagrid from the codebehind.
<asp:datagrid id="dataGrid1" runat="server"
="" bordercolor="black" borderwidth="1" gridlines="Both" cellpadding="3" cellspacing="0" headerstyle-backcolor="#aaaadd">
I'm was thinking of starting like this:
FindControl("DataGrid1")
But there are no members for attributes.
Please help
Yours sincerely
Andla
|
|
|
|
|
First: This should be post on ASP.NET page:
Second:
There are many place to set tyles depend on what style you want to set,these are some hints:
DataGrid.Columns[index].ItemStyle<br />
DataGrid.Columns[index].HeaderStyle<br />
DataGrid.Attributes<br />
DataGrid.CellPadding<br />
DataGrid.CellSpacing
Mazy
"Improvisation is the touchstone of wit." - Molière
|
|
|
|
|
Hi Andla,
The FindControl method returns a generic Control, so you need to caste it to get at the DataGrid's Attribute collection.
So I'd try something like:
<br />
DataGrid DGTmp=(DataGrid)FindControl("DataGrid1");<br />
Then you can manipulate the attributes like this:
<br />
DGTmp.Attributes["Border"]="1";<br />
Notice the use of "Border" rather than "BorderWidth". The Attribute property is written directly to the client, so it does not map exactly to the attributes listed in the tag in the aspx file.
Someone smarter than me will have to explain (to both of use) why this is so...
Hope this helps,
Bill
|
|
|
|
|
HELP please someone I'm using MSComm with C#.....at the moment I'm communicating via a null modem connection between 2 PCs. At the moment I'm just sending out some bytes from one PC to another PC... Got the communication to work... all is well.
The problem; I only expect something to be sent from one PC to other when I press a button on the sending PC which then uses the command object.Output= new byte [] {a number}; to send a byte to the other computer.... the recieving computer in turn recieves this and displays it via the ONComm event handler. The ONComm event on the recieving PC is raised when a byte arrives at the recieving PC serial port on pressing a button on the sending PC.... HOWEVER the ONComm Event is also raised (on the recieving PC)when I start up and exit the sending application. I just can't understand this! This could obviously be a really big problem... Can someone explain or have a solution to this? I would be grateful... I just can't seem to stop this event from raising when the sending application starts up or shuts down... This could be reallly disasterous if the sending PC sends something on start up (ie without me even having instructed the sending application to output a signal by pressing a button) when connected to a PICmicrocontroller which shouldn't recieve that signal....
Here is how i set up the 2 PCs;
com.CommPort = 1;
if (com.PortOpen) com.PortOpen = false;
com.RThreshold = 1;
com.Settings = "9600,n,8,1";
//com.DTREnable = true;
com.Handshaking = MSCommLib.HandshakeConstants.comNone;
com.InputMode = MSCommLib.InputModeConstants.comInputModeBinary;
com.InputLen = 0;
com.NullDiscard = false;
com.OnComm += new System.EventHandler(this.OnComm);
com.PortOpen = true;
Here is the ONComm event handler on the recieving PC which is connected with a null modem cable;
// MSCommLib OnComm Event Handler
private void OnComm(object sender, EventArgs e)
{
//Message box 1
MessageBox.Show("recieved something 1");
switch (com.CommEvent)
{
case (short)MSCommLib.OnCommConstants.comEvReceive:
//Message box 2
MessageBox.Show("recieved something 2");
byte[] x = (byte[]) com.Input;
foreach (byte byt in x)
{
strrecvd += (char) byt;
//Message box 3
MessageBox.Show(strrecvd);........................
The only Message box that should show on the recieving PC is 3 and that only when I press a button to send a byte on the sending PC... However on the inclusion of message boxes 1 and 2 I noticed that when I started up or shut down the sending application they would show on the recieving PC....
anyone?
I would never have known this happens had i not put a message box there to check something else...SCARY!
maria (phillips_maria2@hotmail.com)
|
|
|
|
|
I am converting some code written by someone else in VB(.NET?) to Visual C#. I have figured out most of the weird language, but I am stuck on one problem. Here is the VB code (you may recognize it from MSDN):
Private Sub ConfigureContextMenu(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Popup<br />
Dim ctl As TextBox = CType(Me.SourceControl, TextBox)<br />
MenuItems .Enabled = ctl.CanUndo<br />
MenuItems(7).Enabled = (ctl.SelectedText <> ctl.Text)<br />
MenuItems(2).Enabled = (ctl.SelectionLength > 0) ' cut<br />
... (continues)<br />
How do I translate the usage of the Handles keyword in VB to C#. I know there is no handles keyword.
Thanks in advance for any help,
Josh Koppang
There's a fine line between confidence and arrogance.
|
|
|
|
|
Josh,
I am unfamiliar with the rest of the code...so please take this with the appropriate grain of salt.
It looks like you want your method (ConfigeContextMenu) to handle the Popup event on MyBase (a ContextMenu?)
In C# you do would something like:
MyBase.Popup+=new EventHandler(ConfigContextMenu);
Bill
|
|
|
|