|
Just right-click on in the toolbox and click "Components...". Find the assembly name (the value you put in the AssemblyTitleAttribute in AssemblyInfo.cs, or the assembly filename if you didn't put one), check it and click okay. If you don't see it, make sure you registered your assembly with regasm.exe /codebase "path/to/file.dll". This will register any COM-visible types, but you should declare your classes, interfaces, methods, properties, and enums appropriately. See Creating a CCW for COM enabled non .NET applications[^] for more information.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
hi guys, thanx for your great helps, but im still having problem.
I dont know why but i can insert my control in activex control test container in .net but i have to click implemented categories button then just select .net category.
but in visual basic or even in .net i just can see it as com reference not come component, i cann't add it to tool box!!!
i test this link but this one is the same too, it just shows in references not activex section.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cssample/html/vcsamCOMInteropPart2Sample.asp
any help really appreciated.
|
|
|
|
|
COM registration - like almost everything else - is in the system registry. Even the categories are nothing more than GUIDs, so you can actually implement a catagory just by adding a GUID to your control's registration. Unfortunately, you can't do this through any attributes. All you could do is add a registration and unregistration method and use the ComRegisterFunctionAttribute and ComUnregisterFunctionAttribute on those methods.
If you just need this for your own development, there are two other things you can do. You can open the VBP project in a vanilla text editor like notepad.exe and add a new component (see the existing lines for examples), save it, then reload your VB project, or you can use regedit.exe to add the catagory like I mentioned above (this shouldn't become a common practice, though, since by implementing some catagories you imply that you support certain interfaces):- Click Start->Run
- Type "regedit" (without quotes) and click "OK"
- Expand HKEY_CLASS_ROOT\CLSID and find the GUID for your component (the class, not the interface, which you should'be attributed with the
GuidAttribute ).
- Expand the GUID
- Expand "Implemented Catagories"
- Right-click on "Implemented Catagories" and select "New->Key"
- Type "{40FC6ED4-2438-11CF-A3DB-080036F12502}" (without quotes) and hit return.
- Restart VB and you should now see it.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
guys I really appreciate your knowledge,
Im almost done with my component and i can test it in activex container test program and it works great, but i cant add this component to my vb project, i added this {40FC6ED4-2438-11CF-A3DB-080036F12502} for my class component guid in the registry as u told, but i cant still see it in there as com activex control, can u tell me what this {40FC6ED4-2438-11CF-A3DB-080036F12502} exactly does.
thanx alot
|
|
|
|
|
That's the CATID (catagory ID) for the Controls (as in ActiveX controls) catagory. Use oleview.exe to view these different catagories. This tool is also available by default from the VS.NET Tools menu as the "OLE/COM Object Viewer".
Since I can't really see your machine to know if everything is setup correctly, you could always try what I mentioned before: open the .vbp project file in notepad.exe (or some other vanilla text editor) and add the line manually, so it would look something like this:
Object={YOUR CLASS GUID}#MajorVersion.MinorVersion#0; Filename.dll It should then appear in the toolbox.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
it wroks and thanx very alot.
I was wondering if you say me what can do to make this control visible for all of component client container, sometimes i need to use this control in vb, vc,delphi,... , what i have to do to make it like the other activex control which commin up when you open the component reference form in the vb or anyother language.
and another isues is one i've created one tlb file from that component, but now i cant remove it, i closed every thing, do i need to unregister it,,how !!!
thanx very much
|
|
|
|
|
As I mentioned a while back, you can implement static methods that are attributed with ComRegisterFunctionAttribute and ComUnregisterFunctionAttribute that use the Microsoft.Win32.RegistryKey to do this manually. These functions are called in addition to normal registration of the class.
If you can't release the typelib (.tlb file), you need to remove ALL references to objects defined by the typelib in your project and remove the control from the toolbox.
If you have questions about how COM objects in the VB6 IDE, please jump over to the VB forum.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
I just went through this last week (here at work).
Here is the MSDN article that gave me the proper example I needed.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/csref/html/vcwlkcominteroppart2cservertutorial.asp
You must generate the GUIDs with regasm like Heath mentioned. From VS go to Tools menu and select "Create GUID".
There are only 10 types of people in this world....those that understand binary, and those that do not.
|
|
|
|
|
Actually, regasm.exe only registers the assembly. You need uuidgen.exe or a plethora of alternative programs / extensions. You're right about where to generate a new GUID from VS.NET, though.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Hi there,
I'm currently working on a MSHTML Interface. The implementation of the IDocHostUIHandler and also the editing in general work quiet well for me. The only problem I got is the FilterDataObject method. I can't suppress any data-actions although the method is invoked.
Has anyone a working example of the FilterDataObject implementation that actually filters datatypes?
Many thanks in advance!
Stefan
|
|
|
|
|
|
Yes I read the article, a very helpfull article in general but very short about this particular problem. As I stated above the invokation without filter works fine
Cheers
Stefan
|
|
|
|
|
Your IDataObject parameters - are you sure they are the COM interfaces and not the .NET interfaces (System.Windows.Forms.IDataObject )? These two interfaces are VERY different and won't be marshaled correctly. You must make sure that you use the IDataObject from COM, which should also have been defined when generating your RCW for the typelib containing IDocHostUIHandler (mshtmhst.dll) (and additional typelibs if forward-declaring additional interfaces from other typelibs).
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Yes, I am using MsHtmHstInterop.IDataObject - and yes you are right using System.Windows.Forms.IDataObject is lethal...
Thanks
Stefan
|
|
|
|
|
Okay, then the "no-offense-meant,-I-have-to-ask" question: have you debugged your app and stepped through your implementation of FilterDataObject ? What appears to be happening in there?
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Sure, you have to ask. When I step through the implementation the [in] IDataObject is valid and also the [out] IDataObject is either null or valid if I try to replace, but the return value S_OK, S_FALSE (which I have to set according to the MSDN) has no effect at all (either way & all combinations).
|
|
|
|
|
Is the method return Type an int or similar? If you generated this automatically, it should be void . In the case that you can't (or don't want to) redefine this yourself, you can throw a COMException with the result code. It seems weird, I know, but it works. So, to send S_FALSE (S_OK doesn't require this since not throwing an exception is the same as returning S_OK unless the function signature is defined correctly), throw new COMException(null, 1) . Hopefully this works for you.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Thats actually the way I'm doing it: the signature is like this
void IDocHostUIHandler.FilterDataObject(MsHtmHstInterop.IDataObject pDO, out MsHtmHstInterop.IDataObject ppDORet)
I definded this 2 constants
const int S_OK = 0;
const int S_FALSE = 1;
up to now I return either
throw new COMException("", S_OK);
or
throw new COMException("", S_FALSE);
skipped
throw new COMException("", S_OK);
and
replaced
throw new COMException(null, S_FALSE);
no result so far...
Thanks for your kind replies, I will leave it for now (it's getting late here) - I will figure it out sooner or later.
Cheers
Stefan
|
|
|
|
|
Hi guys!
My question is certainly trivial for you...
I want to convert the text of a textbox to a float with two digits after the separator. And then the whole thing backwards: Convert the float to a string, always showing two digits after the separator.
Right now I do it like that:
float myFloat = float.Parse(TextBox1.Text);
TextBox1.Text = myFloat.ToString(); Everything works fine except for trailing zeros (e.g. '12,30' or 123,00'). The textbox doesn't show any trailing zeros. (I use a comma as separator cause it's a german application)
What can I do to show trailing zeros? Do I have to use IFormatProvider in some way?
Btw... these variables represent amounts of money (€). Is it possible to set somthing like a "currency-mode" for the textbox?
Many thanks in advance!
mYkel
|
|
|
|
|
TextBox1.Text = myFloat.ToString("F");
Charlie
if(!curlies){ return; }
|
|
|
|
|
TextBox1.Text = myFloat.ToString("c");
check out Chris Sells format designer to experiment with format strings :
http://www.sellsbrothers.com/tools/#FormatDesigner
The smaller the mind the greater the conceit.
Aesop
|
|
|
|
|
"C" and "c" are the format specifiers for currency, so unless you want a currency symbol in your number, don't use it. Instead, use "F" or "f" instead.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Good point, he did say 'Is it possible to set somthing like a "currency-mode" for the textbox?' though so I though thats what he wanted.
Cheers.
The smaller the mind the greater the conceit.
Aesop
|
|
|
|
|
You're absolutely right, sorry! A lot of sentences in there and I guess I missed the last one.
In any case - to the original poster if you're following along - you should look at the CultureInfo class and its related properties (IFormatProvider implementations). For most ToString overloads (not the override from Object or another base class), the IFormatProvider (like the NumberFormatInfo ) is used for the Thread.CurrentUICulture , so you don't really need to specify one unless you want to format for a different culture (just for that instance, otherwise you should set Thread.CurrentUICulture and re-initialize your controls) or pass your own IFormatProvider . Typically, such a ToString method (or methods like String.Format ) will specify if they use the current CultureInfo for the format specifier.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Thanks so much for your numerous and quick answers! I knew there is a simple solution...
The myFloat.ToString("F") does all I need.
There's no difference between "f" and "F", right?
Regards, mYkel
|
|
|
|