Re: Fruit basket program in C++/CLI

  • From: Jamal Mazrui <empower@xxxxxxxxx>
  • To: programmingblind@xxxxxxxxxxxxx
  • Date: Wed, 21 Nov 2007 11:40:09 -0500 (EST)

Thanks for those clarifications, Will.

Jamal
On Tue, 20 Nov 2007, Will Pearson
wrote:

> Date: Tue, 20 Nov 2007 17:12:54 -0000
> From: Will Pearson <will@xxxxxxxxxxxxx>
> Reply-To: programmingblind@xxxxxxxxxxxxx
> To: programmingblind@xxxxxxxxxxxxx
> Subject: Re: Fruit basket program in C++/CLI
>
> Hi Jamal,
>
> >From what I understood from what I heard from the VC team around the time
> they were working on C++/CLI the /clr switch and options refer to how the
> compiler converts your code.  So, /clr will compile what it can into MSIL
> and compile everything else into native assembly, /clr:pure will only
> compile to MSIL and will throw compiler errors if there is anything that
> won't go to MSIL, and /clr:safe does the same as /clr:pure but with added
> verifiability.  The semantic context for the /clr options seems to be how
> your code is treated and not the state of the resulting assembly.
>
> I think that you do get a pure MSIL assembly when you use /clr:pure.  I was
> taking a look around the web and came across this statement:
> "There is no CRT support for verifiable
> assemblies. (CRT support is available to pure assemblies through a Pure MSIL
> version of the C Runtime library.)" [1]
> So, it looks as though the version of the CRT that gets linked in when you
> use /clr:pure is an MSIL version of the CRT.  I guess it was included to
> enable people to use familiar CRT functions and templates within managed
> code, which I assume was something added to help people transition their
> code to managed code.
>
> [1] Microsoft Corperation, (2005), 'Pure and Verifiable Code', Taken from
> the web: http://msdn2.microsoft.com/en-us/library/85344whh(VS.80).aspx, Last
> accessed: 20/11/2007
>
> Will
> ----- Original Message -----
> From: "Jamal Mazrui" <empower@xxxxxxxxx>
> To: <programmingblind@xxxxxxxxxxxxx>
> Sent: Tuesday, November 20, 2007 4:38 PM
> Subject: Re: Fruit basket program in C++/CLI
>
>
> I guess I find the use of the word "pure" in /clr:pure to be a bit
> misleading, since the target executable is not a stand-alone .NET
> assembly without other dependencies.  Since it is with /clr:safe,
> however, there is no problem once one understands the syntax.
>
> FYI -- Here is the manifest created by the /clr option:
>
> <?xml version='1.0' encoding='UTF-8' standalone='yes'?>
> <assembly xmlns='urn:schemas-microsoft-com:asm.v1'
> manifestVersion='1.0'>
>   <dependency>
>     <dependentAssembly>
>       <assemblyIdentity type='win32' name='Microsoft.VC80.CRT'
> version='8.0.50608.0' processorArchitecture='x86'
> publicKeyToken='1fc8b3b9a1e18e3b' />
>     </dependentAssembly>
>   </dependency>
> </assembly>
>
>
> Here is the manifest created by the /clr:pure option:
>
> <?xml version='1.0' encoding='UTF-8' standalone='yes'?>
> <assembly xmlns='urn:schemas-microsoft-com:asm.v1'
> manifestVersion='1.0'>
>   <dependency>
>     <dependentAssembly>
>       <assemblyIdentity type='win32' name='Microsoft.VC80.CRT'
> version='8.0.50608.0' processorArchitecture='x86'
> publicKeyToken='1fc8b3b9a1e18e3b' />
>     </dependentAssembly>
>   </dependency>
> </assembly>
>
> Jamal
>
> On Tue, 20 Nov 2007,
> Will Pearson
> wrote:
>
> > Date: Tue, 20 Nov 2007 08:40:36 -0000
> > From: Will Pearson <will@xxxxxxxxxxxxx>
> > Reply-To: programmingblind@xxxxxxxxxxxxx
> > To: programmingblind@xxxxxxxxxxxxx
> > Subject: Re: Fruit basket program in C++/CLI
> >
> > Hi Jamal,
> >
> > The error is because the system can't find msvcrt80.dll or one of the
> > other
> > CRT DLL's.  The first error message you mentioned is one that I've come
> > across before, although in a different context.  There's probably a bit
> > more
> > information regarding that error in one of the system logs, and I suspect
> > it
> > would be logged as a Win SXS error.
> >
> > The manifest tells the system that the application uses side by side
> > assemblies.  This effectively adds c:\windows\winsxs to the DLL search
> > path,
> > which is the folder where side by side assemblies are installed to.  The
> > manifest also tells the loader which version to load.  If that version
> > cannot be located in the winsxs folder then you'll also get an error.
> > This
> > is an important point because Visual Studio 2005 and Visual Studio 2005
> > SP1
> > ship different versions of the CRT.
> >
> > The manifests for side by side assemblies can either be embedded into a
> > binary, such as an exe or DLL, or left as standalone XML files.  What you
> > seem to have is a standalone XML file for your application.  I think the
> > IDE
> > takes a few extra steps to embed the manifest into the application.  As
> > you
> > are using command line tools then you will have to do this extra work by
> > hand using the manifest tool mt.exe.
> >
> > I don't think you can avoid a manifest if you create mixed native/managed
> > code.  The /clr and /clr:pure options require msvcm80.dll.  As this is a
> > DLL
> > associated with the CRT then it will be installed into the winsxs folder.
> > When I took a look at the list of CRT libraries and DLL's that Microsoft
> > provide for Visual C++ 2005 I couldn't find a static link alternative for
> > msvcm80.dll.  The only way to get the necessary functionality is to use
> > msvcm80.dll.
> >
> > Will
> > ----- Original Message -----
> > From: "Jamal Mazrui" <empower@xxxxxxxxx>
> > To: <programmingblind@xxxxxxxxxxxxx>
> > Sent: Monday, November 19, 2007 7:36 PM
> > Subject: Re: Fruit basket program in C++/CLI
> >
> >
> > Hi Will,
> > Unlike the /clr:safe option, I found that both the /clr and /clr:pure
> > options produce a .manifest file that is required for the program to
> > run.
> >
> > If I delete the .manifest file after compiling with the /clr option, I
> > get the following error in a message box:
> >
> > cli_fruit.exe - Application Error
> > The application failed to initialize properly (0x80000003). Click on OK
> > to terminate the application.
> >
> > If I delete the .manifest file after compiling with the /clr:pure
> > option, I get the following error in a message box:
> >
> > Microsoft Visual C++ Runtime Library
> > Runtime Error! Program: c:\cli_fruit\cli_fruit.exe
> > R6034
> > An application has made an attempt to load the C runtime library
> > incorrectly.
> > Please contact the application's support team for more information.
> >
> > With the /clr:pure option, after clearing the message box, I get the
> > following error printed to the console by the .NET runtime:
> >
> > Unhandled Exception: System.TypeInitializationException: The type
> > initializer for '<Module>' threw an exception. --->
> > System.DllNotFoundException: Unable to load DLL 'msvcm80.dll': A dynamic
> > link library (DLL) initialization routine failed.
> >  (Exception from HRESULT: 0x8007045A)
> > at <CrtImplementationDetails>.ThrowModuleLoadException(String ,
> > Exception )
> > at
> > <CrtImplementationDetails>.LanguageSupport.Initialize(LanguageSupport* )
> > at .cctor()
> > --- End of inner exception stack trace ---
> >
> > Jamal
> >
> > On
> > Mon, 19 Nov 2007, Will
> > Pearson wrote:
> >
> > > Date: Mon, 19 Nov 2007 18:17:11 -0000
> > > From: Will Pearson <will@xxxxxxxxxxxxx>
> > > Reply-To: programmingblind@xxxxxxxxxxxxx
> > > To: programmingblind@xxxxxxxxxxxxx
> > > Subject: Re: Fruit basket program in C++/CLI
> > >
> > > Hi Jamal,
> > >
> > > What was the dependancy?  /clr will also require the c run-time as you
> > > are
> > > using native code.
> > >
> > > If the dependancy that you got was the CRT then it explains why you
> > > might
> > > need another manifest.  In Visual Studio 2005 the VC team decided to
> > > deploy
> > > the DLL versions of the CRT as side by side assemblies.  These are not
> > > assemblies in the .Net sense of the term but they do contain manifests
> > > just
> > > like .Net assemblies.  Windoes XP introduced a new way of deploying
> > > DLL's
> > > to
> > > try to decrease DLL hell, and this new deployment method is known as
> > > side
> > > by
> > > side assemblies or sxs for short.  SXS uses a manifest to specify a DLL
> > > version, if the assembly is a DLL, any dependancies that the DLL or exe
> > > has,
> > > and a bit of COM information, such as GUID's, if the assembly uses COM.
> > > The
> > > manifest can store more meta data but those are the common things that
> > > you
> > > find.    The manifest schema is the same one that .Net assemblies use
> > > and
> > > it
> > > is documented in the MSDN library.  Just as with the .Net framework
> > > assemblies, any native exe that uses an sxs assembly needs to include a
> > > manifest to specify that dependancy and version information.  So, you
> > > would
> > > need to include this if you were using the CRT.  Other example of an sxs
> > > assembly is the common controls v6.
> > >
> > > It might be that the two manigests failed to merge, weren't created, or
> > > otherwise got messed up if your dependancy error was on the CRT.
> > >
> > > Will
> > > ----- Original Message -----
> > > From: "Jamal Mazrui" <empower@xxxxxxxxx>
> > > To: <programmingblind@xxxxxxxxxxxxx>
> > > Sent: Monday, November 19, 2007 5:41 PM
> > > Subject: Re: Fruit basket program in C++/CLI
> > >
> > >
> > > FYI -- I was unable to create a stand-alone fruit basket executable with
> > > the /clr or /clr:pure parameters.  Dependencies to other files remained,
> > > which had to be available on the existing search paths, specified in a
> > > seperate manifest file, or included in the same directory as the
> > > executable.  The /clr:safe parameter, however, did create a stand-alone,
> > > .NET-based executable.
> > >
> > > Jamal
> > > On Mon, 19 Nov 2007, Will Pearson wrote:
> > >
> > > > Date: Mon, 19 Nov 2007 16:49:58 -0000
> > > > From: Will Pearson <will@xxxxxxxxxxxxx>
> > > > Reply-To: programmingblind@xxxxxxxxxxxxx
> > > > To: programmingblind@xxxxxxxxxxxxx
> > > > Subject: Re: Fruit basket program in C++/CLI
> > > >
> > > > Hi,
> > > >
> > > > cl.exe has thre modes for compiling C++/CLI:
> > > > - /clr
> > > > This is the C++ interop mode.  It enables native and managed code to
> > > > coexist
> > > > together.  Importantly, it is the only clr option that allows you to
> > > > still
> > > > use pointers in your code.  This means you can use callbacks and other
> > > > places where pointers are typically found in native API's.  As both
> > > > native
> > > > and managed code can coexist together you can create a project that
> > > > uses
> > > > both the Windows API and the .Net Framework.  These are known as mixed
> > > > assemblies in .Net terminology.
> > > >
> > > > - /clr:pure
> > > > Will compile all the code to IL and produce a pure .Net assembly.
> > > > This
> > > > means that you can't use native API's from within your code unless you
> > > > use
> > > > the interop methods provided by the .Net Framework, such as P/Invoke
> > > > or
> > > > COM
> > > > interop.
> > > >
> > > > - /clr:safe
> > > > Produces a .Net assembly that is verifiable.
> > > >
> > > > Will
> > > > ----- Original Message -----
> > > > From: "jaffar" <jaffar@xxxxxxxxxxxxx>
> > > > To: <programmingblind@xxxxxxxxxxxxx>
> > > > Sent: Monday, November 19, 2007 4:29 PM
> > > > Subject: Re: Fruit basket program in C++/CLI
> > > >
> > > >
> > > > Hi Marlon.  At least for the other editions of Visual Studio apart
> > > > from
> > > > the
> > > > express which i cannot be sure off, you can actually make changes to
> > > > your
> > > > compiler options so that it can compile either native c++ code or
> > > > microsoft's cli version of c++ or both.  For example, You can turn off
> > > > the
> > > > _T identifier needed to compile character sequences in your code and
> > > > revert
> > > > to the standard CHAR used by native C++.  Cheers!
> > > > ----- Original Message -----
> > > > From: "Marlon Brandão de Sousa" <splyt.lists@xxxxxxxxx>
> > > > To: <programmingblind@xxxxxxxxxxxxx>
> > > > Sent: Monday, November 19, 2007 10:38 PM
> > > > Subject: Re: Fruit basket program in C++/CLI
> > > >
> > > >
> > > > hmm Jamal, correct me if I am wrong, but my understanding is that one
> > > > can't compile binary, native win32 executable if they use the cli
> > > > part.
> > > > Sure visual C can generate binaries for win32, but if you use the
> > > > extensions, at least based on what I have understood, the .net
> > > > dependencies will be kept ...
> > > > In other words I can use visual C to develope binaries in raw c++ but
> > > > not in the cli version, using visual c.
> > > > Marlon
> > > >
> > > > 2007/11/19, Jamal Mazrui <empower@xxxxxxxxx>:
> > > > > Yes, my undrstanding is that C++/CLI is essentially for C++
> > > > > developers
> > > > > who want to take advantage of the .NET Framework with the language
> > > > > and
> > > > > associated features to which they have become accustomed.  Microsoft
> > > > > submitted the language for international standardization, and this
> > > > > has
> > > > > occurred, so theoretically other software publishers and platforms
> > > > > could
> > > > > develop compilers for C++/CLI besides Microsoft Visual C++.  It is
> > > > > unlikely that will happen practically speaking, however, because of
> > > > > the
> > > > > inherent relation to .NET 2.0.
> > > > >
> > > > > It is noteworthy that Microsoft's compiler can be used to create
> > > > > native
> > > > > Win32 executables in standard C++ without any .NET dependencies.  In
> > > > > other words, the CLI aspect adds language extensions, but not
> > > > > requirements for a traditional C++ developer.
> > > > >
> > > > > Jamal
> > > > > On Mon, 19 Nov 2007, Marlon
> > > > > Brandão de Sousa wrote:
> > > > >
> > > > > > Date: Mon, 19 Nov 2007 09:32:13 -0200
> > > > > > From: Marlon Brandão de Sousa <splyt.lists@xxxxxxxxx>
> > > > > > Reply-To: programmingblind@xxxxxxxxxxxxx
> > > > > > To: programmingblind@xxxxxxxxxxxxx
> > > > > > Subject: Re: Fruit basket program in C++/CLI
> > > > > >
> > > > > > Only to clarify, Lamar, this isn't c or c++. This is c Cli, which
> > > > > > means it is a c++ modified language which allows the use of the
> > > > > > .net
> > > > > > stuff. If you want to develope for anything portable or non
> > > > > > windows
> > > > > > keep away from this for now and go learn the c++ language.
> > > > > > This version of c++, the cli one, introduces some sintactical
> > > > > > modifications (e.e the ^ symbol which seen to be a kind of
> > > > > > pointer),
> > > > > > and some other new things, but it won't compile out of microsoft
> > > > > > compilers and it won't run out of windows ... well it won't run
> > > > > > even
> > > > > > on windows , if the .net is not installed on it.
> > > > > >
> > > > > > 2007/11/19, jaffar <jaffar@xxxxxxxxxxxxx>:
> > > > > > > Hi Lamar.  No.  You'll need at least the .net 2.0 runtime to be
> > > > > > > able
> > > > > > > to
> > > > > run
> > > > > > > it.  Cheers!
> > > > > > > ----- Original Message -----
> > > > > > > From: "Lamar Upshaw" <lupshaw@xxxxxxxxxxxxxx>
> > > > > > > To: <programmingblind@xxxxxxxxxxxxx>
> > > > > > > Sent: Monday, November 19, 2007 4:30 PM
> > > > > > > Subject: Re: Fruit basket program in C++/CLI
> > > > > > >
> > > > > > >
> > > > > > > > Just to clarify, I should be able to run this using minGW,
> > > > > > > > correct?
> > > > > > > >
> > > > > > > > With All Respect,
> > > > > > > > Upshaw, Lamar T
> > > > > > > > ----- Original Message -----
> > > > > > > > From: "Jamal Mazrui" <empower@xxxxxxxxx>
> > > > > > > > To: <programmingblind@xxxxxxxxxxxxx>
> > > > > > > > Sent: Sunday, November 18, 2007 8:14 PM
> > > > > > > > Subject: Fruit basket program in C++/CLI
> > > > > > > >
> > > > > > > >
> > > > > > > >> From the archive at
> > > > > > > >> http://www.EmpowermentZone.com/cli_fruit.zip
> > > > > > > >>
> > > > > > > >> This fruit basket program is written in C++/CLI:  the C++
> > > > > > > >> language
> > > > > with
> > > > > > > >> extensions to support the Common Language Infrastructure of
> > > > > > > >> the
> > > > > > > >> .NET
> > > > > > > >> Framework.  C++/CLI can create native Win32 executables or
> > > > > > > >> libraries,
> > > > > > > >> .NET-based ones, or a combination of both.  Related
> > > > > > > >> development
> > > > > resources
> > > > > > > >> that are freely available from Microsoft.com include the
> > > > > > > >> following:
> > > > > the
> > > > > > > >> .NET Framework 2.0 SDK, the Microsoft Platform SDK for
> > > > > > > >> Windows
> > > > > > > >> Server
> > > > > > > >> 2003, and Visual C++ 2005 Express Edition.
> > > > > > > >>
> > > > > > > >> The archive includes a batch file, compile.bat, which invokes
> > > > > > > >> the
> > > > > > > >> command-line compiler to create an executable, cli_fruit.exe,
> > > > > > > >> which
> > > > > is
> > > > > > > >> about 5K in size.  The batch file initially sets
> > > > > > > >> environmental
> > > > > variables
> > > > > > > >> that may need to be tweaked on another computer so that
> > > > > > > >> appropriate
> > > > > > > >> directories are referenced.
> > > > > > > >>
> > > > > > > >> Besides the resulting executable, No other files are needed
> > > > > > > >> to
> > > > > > > >> run
> > > > > the
> > > > > > > >> program -- as long as .NET 2.0 is installed.   The included
> > > > > > > >> Source
> > > > > code
> > > > > > > >> is
> > > > > > > >> also pasted below.
> > > > > > > >>
> > > > > > > >> Jamal
> > > > > > > >>
> > > > > > > >> /*;
> > > > > > > >> content of cli_fruit.cpp;
> > > > > > > >> Fruit Basket program in C++/CLI
> > > > > > > >> //public domain by Jamal Mazrui
> > > > > > > >> */;
> > > > > > > >>
> > > > > > > >> // Reference libraries
> > > > > > > >> #using <System.dll>
> > > > > > > >> #using <System.Windows.Forms.dll>
> > > > > > > >>
> > > > > > > >> // Import namespaces
> > > > > > > >> using namespace System;
> > > > > > > >> using namespace System::Windows::Forms;
> > > > > > > >>
> > > > > > > >> // Define class
> > > > > > > >> ref class FruitBasket : public Form {
> > > > > > > >> public :
> > > > > > > >> //Define constructor
> > > > > > > >> FruitBasket() {
> > > > > > > >> // Initialize controls and set properties
> > > > > > > >> tlp = gcnew TableLayoutPanel();
> > > > > > > >> tlp->ColumnCount = 3;
> > > > > > > >> tlp->RowCount = 2;
> > > > > > > >>
> > > > > > > >> lblFruit = gcnew Label();
> > > > > > > >> lblFruit->Text = "&Fruit:";
> > > > > > > >> tlp->Controls->Add(lblFruit);
> > > > > > > >>
> > > > > > > >> txtFruit = gcnew TextBox();
> > > > > > > >> tlp->Controls->Add(txtFruit);
> > > > > > > >>
> > > > > > > >> btnAdd = gcnew Button();
> > > > > > > >> btnAdd->Text = "&Add";
> > > > > > > >> btnAdd->Click += gcnew EventHandler(this,
> > > > > &FruitBasket::Button_Click);
> > > > > > > >> tlp->Controls->Add(btnAdd);
> > > > > > > >>
> > > > > > > >> lblBasket = gcnew Label();
> > > > > > > >> lblBasket->Text = "&Basket:";
> > > > > > > >> tlp->Controls->Add(lblBasket);
> > > > > > > >>
> > > > > > > >> lstBasket = gcnew ListBox();
> > > > > > > >> tlp->Controls->Add(lstBasket);
> > > > > > > >>
> > > > > > > >> btnDelete = gcnew Button();
> > > > > > > >> btnDelete->Text = "&Delete";
> > > > > > > >> btnDelete->Click += gcnew EventHandler(this,
> > > > > &FruitBasket::Button_Click);
> > > > > > > >> tlp->Controls->Add(btnDelete);
> > > > > > > >>
> > > > > > > >> Text = "Fruit Basket";
> > > > > > > >> AcceptButton = btnAdd;
> > > > > > > >> StartPosition = FormStartPosition::CenterScreen;
> > > > > > > >> AutoSize = true;
> > > > > > > >> AutoSizeMode =
> > > > > > > >> System::Windows::Forms::AutoSizeMode::GrowAndShrink;
> > > > > > > >> Controls->Add(tlp);
> > > > > > > >> } // FruitBasket constructor
> > > > > > > >>
> > > > > > > >> // Define destructor
> > > > > > > >> virtual ~FruitBasket() {
> > > > > > > >> } // FruitBasket destructor
> > > > > > > >>
> > > > > > > >> // Define event handler;
> > > > > > > >> void Button_Click(Object^ sender, EventArgs^ e) {
> > > > > > > >> if (sender == btnAdd) {
> > > > > > > >> String^ sFruit = txtFruit->Text->Trim();
> > > > > > > >> if (sFruit->Length == 0) {
> > > > > > > >> MessageBox::Show("No fruit to add!", "Alert");
> > > > > > > >> return;
> > > > > > > >> }
> > > > > > > >>
> > > > > > > >> lstBasket->Items->Add(sFruit);
> > > > > > > >> txtFruit->Clear();
> > > > > > > >> lstBasket->SelectedIndex = lstBasket->Items->Count - 1;
> > > > > > > >> }
> > > > > > > >> else if (sender == btnDelete) {
> > > > > > > >> int iFruit = lstBasket->SelectedIndex;
> > > > > > > >> if (iFruit == -1) {
> > > > > > > >> MessageBox::Show("No fruit to delete->", "Alert");
> > > > > > > >> return;
> > > > > > > >> }
> > > > > > > >>
> > > > > > > >> lstBasket->Items->RemoveAt(iFruit);
> > > > > > > >> if (iFruit == lstBasket->Items->Count) iFruit--;
> > > > > > > >> lstBasket->SelectedIndex = iFruit;
> > > > > > > >> }
> > > > > > > >> } // Button_Click event handler
> > > > > > > >>
> > > > > > > >> // Declare controls;
> > > > > > > >> TableLayoutPanel^ tlp;
> > > > > > > >> Label^ lblFruit;
> > > > > > > >> TextBox^ txtFruit;
> > > > > > > >> Button^ btnAdd;
> > > > > > > >> Label^ lblBasket;
> > > > > > > >> ListBox^ lstBasket;
> > > > > > > >> Button^ btnDelete;
> > > > > > > >> }; // FruitBasket class
> > > > > > > >>
> > > > > > > >> // Define entry point of program
> > > > > > > >> int main() {
> > > > > > > >> Application::Run(gcnew FruitBasket());
> > > > > > > >> return 0;
> > > > > > > >> } // main method
> > > > > > > >>
> > > > > > > >> // End of cli_fruit.cpp
> > > > > > > >>
> > > > > > > >> __________
> > > > > > > >> View the list's information and change your settings at
> > > > > > > >> //www.freelists.org/list/programmingblind
> > > > > > > >>
> > > > > > > >
> > > > > > > > __________
> > > > > > > > View the list's information and change your settings at
> > > > > > > > //www.freelists.org/list/programmingblind
> > > > > > > >
> > > > > > >
> > > > > > > __________
> > > > > > > View the list's information and change your settings at
> > > > > > > //www.freelists.org/list/programmingblind
> > > > > > >
> > > > > > >
> > > > > >
> > > > > >
> > > > > > --
> > > > > > When you say "I wrote a program that crashed Windows," people just
> > > > > > stare at you blankly and say "Hey, I got those with the system,
> > > > > > for
> > > > > > free."
> > > > > > Linus Torvalds
> > > > > > __________
> > > > > > View the list's information and change your settings at
> > > > > > //www.freelists.org/list/programmingblind
> > > > > >
> > > > > __________
> > > > > View the list's information and change your settings at
> > > > > //www.freelists.org/list/programmingblind
> > > > >
> > > > >
> > > >
> > > >
> > > > --
> > > > When you say "I wrote a program that crashed Windows," people just
> > > > stare at you blankly and say "Hey, I got those with the system, for
> > > > free."
> > > > Linus Torvalds
> > > > __________
> > > > View the list's information and change your settings at
> > > > //www.freelists.org/list/programmingblind
> > > >
> > > > __________
> > > > View the list's information and change your settings at
> > > > //www.freelists.org/list/programmingblind
> > > > __________
> > > > View the list's information and change your settings at
> > > > //www.freelists.org/list/programmingblind
> > > >
> > > __________
> > > View the list's information and change your settings at
> > > //www.freelists.org/list/programmingblind
> > > __________
> > > View the list's information and change your settings at
> > > //www.freelists.org/list/programmingblind
> > >
> > __________
> > View the list's information and change your settings at
> > //www.freelists.org/list/programmingblind
> > __________
> > View the list's information and change your settings at
> > //www.freelists.org/list/programmingblind
> >
> __________
> View the list's information and change your settings at
> //www.freelists.org/list/programmingblind
> __________
> View the list's information and change your settings at
> //www.freelists.org/list/programmingblind
>
__________
View the list's information and change your settings at
//www.freelists.org/list/programmingblind

Other related posts: