|
The ComReg Sample describes how to register components for remote activation via DCOM. You can find it on your disk:
[FrameworkSDK_Path]\Samples\Technologies\Interop\Advanced\ComReg
|
|
|
|
|
First, I tried posting queries similar to this one on various Usenet newsgroups that seemed reasonably appropriate (including MFC, .Net, and Borland newsgroups) -- the response was thunderous silence. I know what follows are newbie questions, but please be kind and patient and help a guy out.
I am basically a hobbyist programmer, at the moment doing a little work experimenting with some AI stuff. I learned C++, and then tried to teach myself MFC using MS Visual C++ 6.0. At the time I swore off of MFC, which a friend has described as "building a house using toothpicks", and have been playing with Borlands C++ Builder. In C++ Builder, creating forms and other GUI elements is much simpler than MFC, very similar to Visual Basic. Unfortunately, Borland's product is rapidly becoming obsolete.
In the store recently, I was looking at the C++ .Net package. On the back, it still mentioned MFC, but it also claimed that the .Net environment has a user-friendly forms builder. My question: How friendly, and how good?
What I'd be looking for is something like the Visual Basic technology: You select a new form, there's your form on screen. You have a palette of widgets (text boxes, scroll boxes, buttons, check boxes, etc.), and you can drag them to the form and place them easily. For any widget (I forget the formal, technical term), VB provided a list of both properties you could set, and also all the functions that could be called for that widget. The behind-the-scenes stuff -- like making sure a control knew that it was, indeed, part of the form -- was all handled behind the scenes. If you've used it, you know how easy it is.
My first question, then, essentially, is whether creating display forms in Microsoft's C++ .Net environment is just as easy as doing so, or very nearly as easy as doing so, as in Visual Basic? I want to be able to focus on underlying algorithms, and have my GUI display design (and user interaction design) be EASY.
The second question is, as a kind of "Plan B", are there any add-ons to VC++ 6.0 (preferably open-source, shareware, or not-too-expensive, in that order), which create a kind of Visual Basic forms design functionality within the Visual C++ 6.0 environment?
My main focus is on the underlying logic of the AI stuff I'm playing with, so I don't need to do anything to fancy with my GUI. Just basic check boxes, radio buttons, and drop down menus for setting some options (and an "OK" button here and there); and some text boxes and paint areas for displaying results. As I indicated at the outset, I found raw MFC very hard to play with, so if C++ .Net, or some other add-on to VC++ 6, can make GUI design much, much easier, I'd love to hear about it.
FYI, for reasons not worth venturing into here, Java and C# are not good options for my projects.
Thanks in advance for all replies. By the way, I'm a kick-ass freelance tech writer and technical marketing writer, so feel free to contact me at Steven@OpComm.com for support in that area, or check out www.OpComm.com.
|
|
|
|
|
Hi Steven,
I am a more Java And C# oriented guy who knows C++ too. VisualStudio.NET for any langauge is super easy, akin to Borland's Delphi 6 IDE or better. The base is the Framework Class Library which still allows you to do unmanaged code (read:pointers) and play with MFC's "toothpicks" (LOL)
C# is pretty robust and easy though, and you should be able to use the upgrade wizards to pretty easily transform your project to the .NET environment from 6.0, and the IDE is like using VB 6.0 with a few minor changes.
The intellisense and DYNAMIC HELP is well worth the investment in VisualStudio, and you can get it pretty cheap in some places.
Again, just my opinion.
Practice sesquipedalianism!
|
|
|
|
|
Steve,
Go and buy .NET 2003 and learn C# or VB.NET programming. It meets your requirement: it is easier and more comprehensive than VB6, and has a striking similarity to Borland's VCL.
You'll feel at home there. Just go for it.
Enjoy!
Bernd
|
|
|
|
|
Hi,
I have a .jar file how can I install this to VS.NET and make it working with J#.NET?
Kind Regards,
-
When in doubt, push a pawn!
-
|
|
|
|
|
Microsoft does have a Java to J# Conversion tool located on their website, but this will also do:
The Visual J# Binary Converter Tool (JbImp.exe) converts certain Java-language bytecode (.class) files to Microsoft® intermediate language (MSIL). This tool enables developers to convert most JDK 1.1.4 level libraries and applications available only as bytecode files to MSIL assemblies, and run them on Visual J#. Use this tool only if the Java-language sources for the applications or libraries are not available. If Java-language sources are available, it is recommended that you use the Visual J# compiler (vjc.exe) instead.
Features
The Visual J# Binary Converter Tool supports the following:
Conversion of .class files generated from certain Java-language code. The Visual J# Binary Converter Tool will convert code that uses functionality in most of the JDK 1.1.4 level class libraries.
Conversion of .class files containing most Microsoft Visual J++® 6.0 extensions, including delegates and J/Direct®.
The Visual J# Binary Converter Tool provides a number of options that enable the user to take one or more of the following actions:
Specify a DLL or an EXE assembly.
Create a strong-named assembly that can be installed into the Global Assembly Cache (GAC).
Import and use existing .NET Framework assembly code.
Recursively search subdirectories for .class files to convert.
JbImp.exe does not support the following:
Code that uses Java-language/COM Interop technology.
Code that uses functionality in class libraries above the JDK 1.1.4 level. JbImp.exe also does not support code that uses certain functionality in the JDK 1.1.4 level class libraries, including RMI, RNI, JNI, and applets.
Practice sesquipedalianism!
|
|
|
|
|
It wasnt too clear my last post but this sums it up for the J# Binary Tool:
If you do not have the source files, you can convert class (.class) files or archive (.cab, .jar, or .zip) files to class libraries using the Visual J# Binary Converter Tool.
The names of any .class files to convert. This option lists both directories and files. Directory and file names can contain the asterisk (*) and question mark (?) as wildcards. You can also specify a CAB, ZIP, or JAR file here.
Practice sesquipedalianism!
|
|
|
|
|
Wondering if anyone can help me. I have the tutorial from CodeProject on loading/writing XML files into a DataSet. Thats no problem.
I also have the encryption tutorial (Rindajeal) on how to encrypt and decrypt text files.
Can someone help me put it together? Not sure if it possible. What I want is to be able to read/write XML files that will be encryted in a data files directory (hopefully that can be zipped) and use these in a dataset (then a DataView to DataGrid..) I want to do this instead of using SQL Server..
Has anyone done this or give me pointers?? I have tried to pass the stream over but no luck.
Any examples??
Practice sesquipedilianism!
|
|
|
|
|
Heres the code I have thus far. I can get it to encrypt it seems but Im not sure if it is encrypting correctly, or decrypting correctly...
I use the Page_Load just to debug by loading a standard authors.xml file...
I keep getting a root element missing exception when trying to load the encrypted file.
I am using a static key and IV and I know I should use ASCIIEncoding instead of UnicodeEncoding for that but will change it later once I can get it working....
[code]
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.IO;
using System.Security.Cryptography;
using System.Text;
namespace ReadingXML
{
/// <summary>
/// Summary description for Form1.
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.TextBox textBox1;
private System.Windows.Forms.DataGrid dataGrid1;
private System.Windows.Forms.Button btnReadXML;
private System.Windows.Forms.Button btnShowSchema;
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;
private System.Windows.Forms.Button btnUpdateXML;
DataSet dsAuthors = new DataSet("authors");
public Form1()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();
//
// TODO: Add any constructor code after InitializeComponent call
//
}
/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.textBox1 = new System.Windows.Forms.TextBox();
this.dataGrid1 = new System.Windows.Forms.DataGrid();
this.btnReadXML = new System.Windows.Forms.Button();
this.btnShowSchema = new System.Windows.Forms.Button();
this.btnUpdateXML = new System.Windows.Forms.Button();
((System.ComponentModel.ISupportInitialize)(this.dataGrid1)).BeginInit();
this.SuspendLayout();
//
// textBox1
//
this.textBox1.Location = new System.Drawing.Point(8, 232);
this.textBox1.Multiline = true;
this.textBox1.Name = "textBox1";
this.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
this.textBox1.Size = new System.Drawing.Size(672, 104);
this.textBox1.TabIndex = 0;
this.textBox1.Text = "textBox1";
//
// dataGrid1
//
this.dataGrid1.DataMember = "";
this.dataGrid1.HeaderForeColor = System.Drawing.SystemColors.ControlText;
this.dataGrid1.Name = "dataGrid1";
this.dataGrid1.Size = new System.Drawing.Size(680, 224);
this.dataGrid1.TabIndex = 1;
//
// btnReadXML
//
this.btnReadXML.Location = new System.Drawing.Point(40, 344);
this.btnReadXML.Name = "btnReadXML";
this.btnReadXML.TabIndex = 2;
this.btnReadXML.Text = "Read XML";
this.btnReadXML.Click += new System.EventHandler(this.btnReadXML_Click);
//
// btnShowSchema
//
this.btnShowSchema.Location = new System.Drawing.Point(136, 344);
this.btnShowSchema.Name = "btnShowSchema";
this.btnShowSchema.Size = new System.Drawing.Size(88, 23);
this.btnShowSchema.TabIndex = 3;
this.btnShowSchema.Text = "Show Schema";
this.btnShowSchema.Click += new System.EventHandler(this.btnShowSchema_Click);
//
// btnUpdateXML
//
this.btnUpdateXML.Location = new System.Drawing.Point(248, 344);
this.btnUpdateXML.Name = "btnUpdateXML";
this.btnUpdateXML.TabIndex = 4;
this.btnUpdateXML.Text = "Update XML";
this.btnUpdateXML.Click += new System.EventHandler(this.btnUpdateXML_Click);
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(688, 381);
this.Controls.AddRange(new System.Windows.Forms.Control[] {
this.btnUpdateXML,
this.btnShowSchema,
this.btnReadXML,
this.dataGrid1,
this.textBox1});
this.Name = "Form1";
this.Text = "ReadingXMLExample";
this.Load += new System.EventHandler(this.Form1_Load);
((System.ComponentModel.ISupportInitialize)(this.dataGrid1)).EndInit();
this.ResumeLayout(false);
}
#endregion
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
private void Form1_Load(object sender, System.EventArgs e)
{
// string cryptFile="C:\\Documents and Settings\\Eric L. Golpe\\My Documents\\Visual Studio Projects\\ReadingXML\\bin\\authors.xml";
// DataSet dsAuthors = new DataSet();
// dsAuthors.ReadXml(cryptFile);
// dataGrid1.DataSource = dsAuthors;
// dataGrid1.DataMember = "authors";
// dataGrid1.CaptionText = dataGrid1.DataMember;
}
private void btnReadXML_Click(object sender, System.EventArgs e)
{
try
{
// The encrypted file to be read from.
string cryptFile="C:\\Documents and Settings\\Eric L. Golpe\\My Documents\\Visual Studio Projects\\ReadingXML\\bin\\authors.bsc";
// Create key and IV hash
UnicodeEncoding UE = new UnicodeEncoding();
byte[] key = UE.GetBytes("elg08754");
// Instantiate new crypto object
RijndaelManaged RMCrypto = new RijndaelManaged();
// Create an instance of StreamReader to read from a file.
FileStream cryptedstream = new FileStream(cryptFile, FileMode.Open, FileAccess.Read);
// Create New MemoryStream object to hold unencrypted data
MemoryStream memstream = new MemoryStream();
// Open a CryptoStream linking objects
CryptoStream cs = new CryptoStream(cryptedstream,
RMCrypto.CreateDecryptor(key, key),
CryptoStreamMode.Read);
int data;
while ((data=cs.ReadByte())!=-1)
memstream.WriteByte((byte) data);
// Create the DataSet to hold the data.
DataSet dsAuthors = new DataSet();
// populate the dataset with the XML String now in memstream
dsAuthors.ReadXml(memstream, XmlReadMode.ReadSchema);
// Set the datasource and display the data;
dataGrid1.DataSource = dsAuthors;
dataGrid1.DataMember = "authors";
dataGrid1.CaptionText = dataGrid1.DataMember;
// Close the streams
cs.Close();
memstream.Close();
// We're good, set the 'good to go' message
MessageBox.Show("Everything is OK", "OK");
}
catch (Exception x)
{
MessageBox.Show("Decryption failed!\nSpecific Details: " + x.ToString(), "Error");
}
}
private void btnShowSchema_Click(object sender, System.EventArgs e)
{
System.IO.StringWriter swXML = new System.IO.StringWriter();
dsAuthors.WriteXmlSchema(swXML);
textBox1.Text = swXML.ToString();
}
private void btnUpdateXML_Click(object sender, System.EventArgs e)
{
// The following function uses Rijndael encryption algorithm to encrypt file
// Because the Rijndael algoritm is private-key algoritm we need one
// private key and IV. I composed private key from password entered by user.
// IV is the same as password but this probably is not good.
// A key and IV have to be exactly 16 bytes length so we have to truncate
// password if it is longer then 8 characters (16 bytes) or to add some characters
// if password length is less then 8 characters.
try
{
UnicodeEncoding UE = new UnicodeEncoding();
byte[] key = UE.GetBytes("elg08754");
string cryptFile="C:\\Documents and Settings\\Eric L. Golpe\\My Documents\\Visual Studio Projects\\ReadingXML\\bin\\authors.bsc";
FileStream fsCrypt=new FileStream(cryptFile, FileMode.OpenOrCreate);
RijndaelManaged RMCrypto = new RijndaelManaged();
//Create a new temporary stream object
MemoryStream memIn=new MemoryStream();
// Write XML formatted data to the crypto stream with the schema from the dataset to the stream
dsAuthors.WriteXml(memIn, XmlWriteMode.IgnoreSchema);
//Creat the CrytoStream Object to do the encryption.
CryptoStream cs = new CryptoStream(fsCrypt,
RMCrypto.CreateEncryptor(key, key),
CryptoStreamMode.Write);
// Write the crypted data to the MemoryStream;
int data;
while ((data=memIn.ReadByte())!=-1)
cs.WriteByte((byte) data);
MessageBox.Show("Everything is OK", "OK");
// Close the crypto stream
memIn.Close();
cs.Close();
fsCrypt.Close();
}
catch (Exception xx)
{
MessageBox.Show("Encryption failed!\nSpecific Details: " + xx.ToString(), "Error");
}
}
}
}
[code]
Practice sesquipedalianism!
|
|
|
|
|
I don't see what the problem is. Have a method that reads a file, decrypts it, and reads that in to a DataSet (DataSet.ReadXml ). Of course, this requires that the application reading the file can access the private key of the key pair from which the public key was used to encrypt the file. Make sure this is secured well and that it isn't distributed to clients in a haphazard way. Once someone gets a hold of the private key, there's nothing they can't do!
Since you are working with XML, you might consider XML Encryption and Signatures. I have an article about XML Digitial Signatures and encryption isn't much different: http://www.codeproject.com/dotnet/xmldsiglic.asp[^]
Being a industry standard and all, it is a lot better to use for practically any system that understands XML. This also takes the canonicalization of XML into account, which can be important when submitting text files (for instance, changing the line-endings via encoding changes could invalidate the document and it won't be descrypted correctly).
-----BEGIN GEEK CODE BLOCK-----
Version: 3.21
GCS/G/MU d- s: a- C++++ UL@ P++(+++) L+(--) E--- W+++ N++ o+ K? w++++ O- M(+) V? PS-- PE Y++ PGP++ t++@ 5 X+++ R+@ tv+ b(-)>b++ DI++++ D+ G e++>+++ h---* r+++ y+++
-----END GEEK CODE BLOCK-----
|
|
|
|
|
Did not know where else to post this....I have tried just about everything to get this to work but can't figure out. I am getting "Unspecified error" when trying to open Visual Source Safe from Visual Studio 2003 .NET. I have completely uninstalled VSS and VS.NET the reinstalled, have all updates. I can access VSS and VS.NET by themselves but can't get to VSS from VS.NET when I go to File > Source Control > Microsoft Visual SourceSafe.
Anyone have any answers?
Thanks,
John
|
|
|
|
|
If you rename a subproject in a Visual Studio .NET Enterprise Template project before you check out the solution, Visual SourceSafe updates the solution but does not check out the solution.
Later, when another user tries to work with the source code control copy of the project, the user may receive "Unspecified Error" messages.
CAUSE
When you rename the subproject, Visual SourceSafe updates the source control information in memory to the solution file. However, because you did not check out the solution file, SourceSafe does not change the source control copy of the solution.
RESOLUTION
To work around this issue, follow these steps:
Close the solution, which may require you to quit the Visual Studio .NET integrated development environment (IDE).
Delete all of the .vsscc, the .vssscc, and the .vspscc files from all of the project and solution folders.
Reopen the solution.
Remove any projects that will not load, and then add them.
Projects may not load for several reasons, for example, because the binding information may be incorrect, or because you may receive errors.
Add the solution to source code control to a new project.
Practice sesquipedalianism!
|
|
|
|
|
I've been getting a weird flicker with my TabControl (.NET Windows Forms) when I try and use it
in a dynamically resizable window. I can move the window around and it paints fine but resizing it looks pretty bad. Any ideas?
Thx,
Sieg
|
|
|
|
|
SYMPTOMS
When making a call to TabPage.setSelectedTab() from within an OnSelectedIndexChanged event handler of the parent TabControl, the focus will first go to the user-selected index before returning to the index value set in the setSelectedTab() call. In addition, when returning to the index set in code by the setSelectedTab() call, the children components of the set TabPage will not be visible and Control.setVisible(true) must be used, causing a noticeable flicker.
RESOLUTION
To work around this problem, call Control.setVisible(true) on the TabPage after the setSelectedTab() call is made.
Maybe on the resize event you need to again setVisible(true) to get the flicker to go away? Give it a whirl and see what happens...
Practice sesquipedalianism!
|
|
|
|
|
I have error in my clients's computer when view report. The error is "Cannot find keycodev2.dll or invalid keycode" I already follow this article http://support.crystaldecisions.com/library/kbase/articles/c2011205.asp. But i still have this error. Please help mee Thanks
|
|
|
|
|
Hi all
Is it possible to run MC++ apps from (for example) a C# .NET web application ? I'll be checking with the host but was wondering if anyone else had done this or similiar.
BTW the app in question 'brands' .EXE files for registered customers and I'd prefer not to port the existing code to C# etc.
TIA
Jerry
|
|
|
|
|
Why do u wanna run it as an app? Just load it as an assembly reference!
leppie::AllocCPArticle("Zee blog"); Seen on my Campus BBS: Linux is free...coz no-one wants to pay for it.
|
|
|
|
|
Go on. Gimme a bit more detail )
|
|
|
|
|
One of the major benefits of Microsoft® .NET is that it provides a language-independent development system. You can write classes in Visual Basic®, C++, C#—whatever—and use them in other languages; you can even derive from classes in a different language. But what happens when you want to call some old-school unmanaged DLL? You have to somehow translate .NET objects into the structs, char*'s, and function pointers C expects. In techno lingo, your parameters must be marshaled. Marshaling is a big topic, but luckily you don't have to know much to get the job done.
To call a DLL function from C#, first you must provide a declaration, something programmers using Visual Basic have been doing for years. In C#, it's DllImport:
using System.Runtime.InteropServices; // DllImport
public class Win32 {
[DllImport("User32.Dll")]
public static extern void SetWindowText(int h, String s);
}
In C#, you use DllImport to tell the compiler where the entry point lives and bundle your wrapper functions inside a class. You can give this class any name you like; I chose Win32. You can even put the class inside a namespace. To compile Win32API.cs, type:
csc /t:library /out:Win32API.dll Win32API.cs
Now you have a Win32API.dll you can use in any C# project.
using Win32API;
int hwnd = // get it...
String s = "I'm so cute."
Win32.SetWindowText(hwnd, s);
Practice sesquipedalianism!
|
|
|
|
|
Indeed and Thanks. My question was obviously not well phrased. Given that I have a working VC++ console app I could compile it for IL instead of native code. Would this package then run on a remotely hosted .NET server along with my Web Service ? Would this be true for an unmanaged (but still compiled to IL) DLL ?
I am all too familiar with marshalling etc ) And I must confess that I took the plunge and wrote an analogue in C# on the grounds that it would have to be done one day !
Jerry
|
|
|
|
|
Just because something is written "in .NET" doesn't make it remotable. It has to extend MarshalByObjectRef or be a value type and be serializable (in most cases, attributed with SerializableAttribute ). Something has to host the remote object, too. For instance, just having a console app won't work. Now, a console app that registers a well-known object (WKO) either via code or a config file (latter is preferable for easy changes) and keeps itself running (waits for a quit command of sorts) would work. Clients would connect to that WKO.
The documentation about .NET remoting is okay, at least if you already have some idea of what it does. If you don't, I suggest you get the book from MSPress entitled .NET Remoting (at www.microsoft.com/mspress/books/6172.asp).
-----BEGIN GEEK CODE BLOCK-----
Version: 3.21
GCS/G/MU d- s: a- C++++ UL@ P++(+++) L+(--) E--- W+++ N++ o+ K? w++++ O- M(+) V? PS-- PE Y++ PGP++ t++@ 5 X+++ R+@ tv+ b(-)>b++ DI++++ D+ G e++>+++ h---* r+++ y+++
-----END GEEK CODE BLOCK-----
|
|
|
|
|
Sure but I was not asking about remoting. Can a .NET service invoke (using the Process class) a process written in unmanaged C++ but compiled to IL rather than native code ?
Jerry
|
|
|
|
|
The Process class can start any process executable, regardless of how it compiled (i.e., it doesn't matter if it is a VB executable, unmanaged C++, managed C++ or other from any other languages targeting the CLR, compiled PERL exectable, etc.).
Also, any C++ application compiled to IL is managed (save the purely native functions). You can't compiled to IL and have an unmanaged executable.
-----BEGIN GEEK CODE BLOCK-----
Version: 3.21
GCS/G/MU d- s: a- C++++ UL@ P++(+++) L+(--) E--- W+++ N++ o+ K? w++++ O- M(+) V? PS-- PE Y++ PGP++ t++@ 5 X+++ R+@ tv+ b(-)>b++ DI++++ D+ G e++>+++ h---* r+++ y+++
-----END GEEK CODE BLOCK-----
|
|
|
|
|
The .NET Framework includes the base class library (BCL) and the common language runtime (CLR). The CLR just-in-time compiles (jit's) intermediate language (IL, or more specifically MSIL) and executes it. Languages that target the CLR (MC++, C#, VB.NET, J#, PERL.NET, etc.) compile to IL in the form of assemblies, which are executable files (.exe, .dll) that contain 0 or more modules (compiled code), 0 or more embedded resources, various assembly attributes, and a manifest (like a plane or boat passenger manifest) of all that stuff in the assembly. So, it doesn't matter which language you use they all compile to assemblies using IL.
Make yourself a Managed DLL project for MC++ and puts some classes into it. Make a Windows Forms application (or something) in C#. If both of these projects are in VS.NET in a single solution, right-click on the Windows Forms project and click Add Reference. Click the Project tab and select your other project. Otherwise, click the .NET tab and browse for the MC++ assembly. Use classes from the MC++ assembly and compile your app. Viola'!
This is - in essence - no different from library bindings in Win32 or any other programming platform. It's all in the docs!
Consider yourself educated - now go out and read the docs to further your education!
-----BEGIN GEEK CODE BLOCK-----
Version: 3.21
GCS/G/MU d- s: a- C++++ UL@ P++(+++) L+(--) E--- W+++ N++ o+ K? w++++ O- M(+) V? PS-- PE Y++ PGP++ t++@ 5 X+++ R+@ tv+ b(-)>b++ DI++++ D+ G e++>+++ h---* r+++ y+++
-----END GEEK CODE BLOCK-----
|
|
|
|
|
Thanks Heath. PLease see my reply to the previous post.
Jerry
|
|
|
|
|