home *** CD-ROM | disk | FTP | other *** search
/ Chip 2000 May / Chip_2000-05_cd1.bin / zkuste / Perl / ActivePerl-5.6.0.613.msi / 䆊䌷䈹䈙䏵-䞅䞆䞀㡆䞃䄦䠥 / _defa3e53d0c7c88bb443b222870c666c < prev    next >
Text File  |  2000-03-22  |  18KB  |  412 lines

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  2. <HTML>
  3.  
  4. <HEAD>
  5. <TITLE>ActivePerl faq10 - Embedding and Extending</TITLE>
  6. <LINK rev="made" href="mailto:support@ActiveState.com">
  7. <META name="GENERATOR" charset="iso-8859-1" content="Microsoft FrontPage 4.0">
  8. <META name="ProgId" content="FrontPage.Editor.Document">
  9. <LINK rel="STYLESHEET" href="../../Active.css" type="text/css" media="screen">
  10. </HEAD>
  11.  
  12. <BODY bgcolor="#ffffff">
  13.  
  14.     <!-- beginning of leaf header-->
  15. <TABLE border="0" cellpadding="0" cellspacing="0" width="100%">
  16.   <TR>
  17.     <TD class="block" valign="MIDDLE" width="100%" bgcolor="#cccccc"><FONT size="+1"><STRONG>
  18.       <P class="block"> ActivePerl FAQ</P>
  19.       </STRONG></FONT></TD>
  20.   </TR>
  21. </TABLE>
  22. <BR>
  23.      <!-- end of leaf content--> <!-- INDEX BEGIN --> 
  24. <UL>
  25.   <LI><A href="#NAME">NAME</A></LI>
  26.   <LI><A href="#DESCRIPTION">DESCRIPTION</A>
  27.     <UL>
  28.       <LI><A href="#How_do_I_write_an_extension_for_">How do I write an extension for ActivePerl?</A></LI>
  29.       <LI><A href="#How_do_I_embed_the_Perl_interpre">How do I embed the Perl interpreter into my
  30.         C/C++ program?</A></LI>
  31.       <LI><A href="#I_have_a_program_with_perl_embed">I have a program with perl embedded from the
  32.         standard distribution.</A></LI>
  33.     </UL>
  34.   </LI>
  35.   <LI><A href="#AUTHOR_AND_COPYRIGHT">AUTHOR AND COPYRIGHT</A></LI>
  36. </UL>
  37.     <!-- INDEX END -->
  38. <HR>
  39. <H1><A name="NAME">NAME</A></H1>
  40. <P>perlwin32faq10 - Embedding and Extending</P>
  41. <HR>
  42. <H1><A name="DESCRIPTION">DESCRIPTION</A></H1>
  43. <P>Techniques for Embedding and Extending ActivePerl</P>
  44. <HR>
  45. <H2><A name="How_do_I_write_an_extension_for_">How do I write an extension for ActivePerl?</A></H2>
  46. <P>Writing extensions in <FONT size="-1">C</FONT> or <FONT size="-1">C++</FONT> for ActivePerl is
  47. identical to writing them for standard Perl. Consult the perlxstut document for complete information
  48. and pointers to other sources of information.</P>
  49. <P>As a result of the oneperl effort, you now longer need to build ActivePerl from the source
  50. distribution to write or compile extensions. The Perl installation will detect your <FONT size="-1">C</FONT>
  51. compiler (currently, just Visual <FONT size="-1">C++),</FONT> and configure Perl to use it for
  52. compiling extensions.</P>
  53. <P>Note that writing extensions in <FONT size="-1">C</FONT> or <FONT size="-1">C++</FONT> is not
  54. easy. You need to have experience writing <FONT size="-1">C</FONT> programs for Windows platforms
  55. before you should even think about writing an extension.</P>
  56. <HR>
  57. <H2><A name="How_do_I_embed_the_Perl_interpre">How do I embed the Perl interpreter into my C/C++
  58. program?</A></H2>
  59. <P>As of build 500, this is quite easy. ActivePerl exposes Perl's internals through a <FONT size="-1">C++</FONT>
  60. object called <FONT size="-1">PERL_OBJECT.</FONT> Among other things, <FONT size="-1">PERL_OBJECT</FONT>
  61. simplifies the creation of multiple Perl interpreters within a single process.</P>
  62. <P>To embed ActivePerl in your own application, you must have the following:</P>
  63. <UL>
  64.   <LI>
  65.     <P>Microsoft Visual <FONT size="-1">C++</FONT></P>
  66.   </LI>
  67.   <LI>
  68.     <P><FONT size="-1">A</FONT> binary release of ActivePerl (build 500 or later)</P>
  69.   </LI>
  70.   <LI>
  71.     <P>The ActivePerl source code (the version of the source code must match the build of your
  72.     binary version of Perl)</P>
  73.   </LI>
  74. </UL>
  75. <P>Before you can compile an application that embeds ActivePerl, you must compile Perl from source.
  76. This does not mean that you must install Perl from source - the reason that you must compile Perl
  77. from source is that the compilation process creates the <EM>DynaLoader.c</EM> source code file,
  78. which is required if you want to use any extensions in your application.</P>
  79. <P>To compile Perl from source:</P>
  80. <OL>
  81.   <LI><STRONG><A name="item_"></A></STRONG>
  82.     <P>Change directory to the <EM>win32</EM> directory of your Perl source distribution and edit <EM>Makefile</EM>
  83.     as necessary.</P>
  84.   </LI>
  85.   <LI>
  86.     <P>Type <CODE>nmake</CODE>. This will compile all of Perl.</P>
  87.   </LI>
  88.   <LI>
  89.     <P>Type <CODE>nmake test</CODE>. This ensures that Perl built correctly and passes all its
  90.     tests.</P>
  91.   </LI>
  92.   <LI>
  93.     <P>Perl is now compiled, and the <EM>DynaLoader.c</EM> file is created. If you did not install a
  94.     binary release of Perl, you can issue the command <CODE>make install</CODE>, which will install
  95.     Perl for you. This step is not necessary if you installed a binary release of Perl.</P>
  96.   </LI>
  97. </OL>
  98. <P>Once you have compiled Perl from source, you have a source tree that can be used to build an
  99. embedded version of Perl. Here is a simple program that includes an embedded Perl interpreter. It is
  100. actually quite a bit like <EM>perl.exe</EM>. You can use all the command-line switches that are
  101. supported by perl, and you can also include the name of a script to execute. If you supply no
  102. switches, it will read in a Perl program from standard input, and executes the program when
  103. end-of-file is encountered. Save this file as <EM>MyPerl.cpp</EM> on your computer (remember to
  104. outdent the source code):</P>
  105. <PRE>
  106.     /*
  107.         
  108.         1) include perlhost.h. This header defines all the
  109.            OS Interfaces that are used by the PERL_OBJECT.
  110.         2) define the host data structure 'CPerlHost'
  111.         3) call the CPerlHost member function PerlCreate,
  112.            which calls perl_alloc and perl_construct
  113.         4) call the CPerlHost member function PerlParse
  114.         5) call the CPerlHost member function PerlRun
  115.         6) when done, call the CPerlHost member function PerlDestroy,
  116.            which calls perl_destruct and perl_free
  117.         
  118.         Including XSUB.h brings in the files that have macros to redefine
  119.         the perl_* functions, to work with PERL_OBJECT. Note that these 
  120.         macros may cause problems when there are name collisions. A common 
  121.         problem is having a local variable that has the same name as a Perl 
  122.         function. To track down these name collisions compile using '/P' 
  123.         option with VC++ so that you can see what the preprocessor has done.
  124.         
  125.     */ 
  126.     #include <EXTERN.h>
  127.     #include <perl.h>
  128.     #define NO_XSLOCKS
  129.     
  130.     // Bring in the macros that redefine perl_* functions to work with
  131.     // PERL_OBJECT.
  132.     //
  133.     #include <XSUB.h>
  134.     
  135.     /* for Win32 */
  136.     #include "win32iop.h"
  137.     #include <fcntl.h>
  138.     #include <perlhost.h>
  139.     #include <stdio.h>
  140.     
  141.     // DynaLoader stuff.
  142.     //
  143.     char *staticlinkmodules[] = {
  144.         "DynaLoader",
  145.         NULL,
  146.     };
  147.     
  148.     // More DynaLoader stuff.
  149.     //
  150.     EXTERN_C void boot_DynaLoader _((CV* cv _CPERLarg));
  151.     
  152.     static void
  153.     xs_init(CPERLarg)
  154.     {
  155.         char *file = __FILE__;
  156.         dXSUB_SYS;
  157.         newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file);
  158.     }
  159.     
  160.     CPerlObj *pPerl;  // The Perl object used by the host.
  161.     
  162.     int main (int argc, char **argv, char **env)
  163.     {
  164.         CPerlHost host;     // The Perl host
  165.         host.PerlCreate();  // Create an instance of the Perl Interpreter
  166.     
  167.         printf("Welcome to my very own Perl!\n\n");
  168.     
  169.         // Read arguments from the command line.  If no script is named on the
  170.         // command-line, and nothing is specified for -e, the interpreter will
  171.         // read commands from standard input (just like Perl!).
  172.         //
  173.         host.PerlParse(xs_init, argc, argv, NULL);
  174.     
  175.         host.PerlRun();      // Run the interpreter.
  176.         host.PerlDestroy();  // Destroy the interpreter.
  177.         return 0;
  178.     }
  179. </PRE>
  180. <P>To compile this program, you must use the following <EM>Makefile</EM>. Be sure to update <CODE>LIBDIR</CODE>
  181. to point to the <EM>CORE</EM> subdirectory of your Perl binary installation, and update <CODE>SRCDIR</CODE>
  182. to point to the <EM>src</EM> directory of the Perl source code that you compiled earlier. Save this
  183. file as <EM>Makefile</EM> (remember to outdent the contents):</P>
  184. <PRE>
  185.     LIBDIR = C:\Perl\5.00500\lib\MSWin32-x86\CORE
  186.     SRCDIR = C:\5.00500\src
  187.     
  188.     LIBS = oldnames.lib kernel32.lib user32.lib winspool.lib advapi32.lib \
  189.            shell32.lib ole32.lib  oleaut32.lib netapi32.lib uuid.lib \
  190.            wsock32.lib version.lib PerlCRT.lib $(LIBDIR)\PerlCore.lib
  191. </PRE>
  192. <PRE>
  193.     CCFLAGS = -c -I$(LIBDIR) -Gf -W3 -DWIN32 -D_CONSOLE -DPERL_CORE \
  194.               -O2 -MD -DNDEBUG -TP -GX -DPERL_OBJECT -UPERLDLL
  195.     CCDYNA = $(CCFLAGS) -I$(SRCDIR)\ext\DynaLoader
  196.     
  197.     all:
  198.         cl.exe $(CCFLAGS) -Fo.\MyPerl.obj MyPerl.cpp
  199.         cl.exe $(CCFLAGS) -Fo.\win32.obj $(SRCDIR)\win32\win32.c
  200.         cl.exe $(CCFLAGS) -Fo.\win32sck.obj $(SRCDIR)\win32\win32sck.c
  201.         cl.exe $(CCFLAGS) -Fo.\DynaLoader.obj \
  202.                           $(SRCDIR)\ext\DynaLoader\DynaLoader.c
  203.         link.exe -nologo -nodefaultlib -release -machine:x86 $(LIBS) \
  204.             -subsystem:console MyPerl.obj win32.obj win32sck.obj \
  205.             DynaLoader.obj setargv.obj
  206. </PRE>
  207. <P>Make sure that <EM>PerlCRT.lib</EM> has been installed properly. For more information, see <A href="#How_do_I_write_an_extension_for_">How
  208. do I write an extension for ActivePerl?</A>.</P>
  209. <P>You can then compile <EM>MyPerl.cpp</EM> by typing <CODE>nmake</CODE> at the command line (make
  210. sure that both <EM>MyPerl.cpp</EM> and <EM>Makefile</EM> are in your current working directory).
  211. This will produce the file <EM>MyPerl.exe</EM>, which you can run at the command line as though it
  212. were <EM>perl.exe</EM>:</P>
  213. <PRE>
  214.     C:\MyPerl>myperl -e "print qq[Hello, World\n];"
  215.     Welcome to my very own Perl!
  216.     
  217.     Hello, World
  218. </PRE>
  219. <P>or:</P>
  220. <PRE>
  221.     C:\MyPerl>myperl
  222.     Welcome to my very own Perl!
  223.     
  224.     print "Hello, world\n";
  225.     ^Z
  226.     Hello, world
  227. </PRE>
  228. <P>If you want to use modules and extensions from your local Perl installation, you'll need to do
  229. one of two things. The simplest thing you can do is copy your executable to the same location as
  230. perl.exe.</P>
  231. <P>If this is not an option, you need to tell your program where to find things. This can be
  232. accomplished by setting the <CODE>PERL5LIB</CODE> environment variable with something like:</P>
  233. <PRE>
  234.     set PERL5LIB=C:\Perl\5.00500\lib;C:\Perl\site\5.00500\lib;C:\Perl\site\lib 
  235. </PRE>
  236. <P>Then you can use modules and extensions from your local Perl installation:</P>
  237. <PRE>
  238.     C:\MyPerl>MyPerl -MWin32::OLE -e "print $Win32::OLE::VERSION;"
  239.     Welcome to my very own Perl!
  240.     
  241.     0.0807
  242. </PRE>
  243. <P>The following example is based on the PerlPower example from Doug MacEachern and Jon Orwant's
  244. perlembed document (this is part of Perl, and you should have a copy included with ActivePerl). You
  245. should save the following program as <EM>PerlPower.cpp</EM>:</P>
  246. <PRE>
  247.     /*
  248.         To show how to embed Perl with PERL_OBJECT defined, we will show the
  249.         changes needed for the PerlPower sample that is in perlembed.pod.
  250.         
  251.         1) include perlhost.h. This header defines all the
  252.            OS Interfaces that are used by the PERL_OBJECT.
  253.         2) define the host data structure 'CPerlHost'
  254.         3) call the CPerlHost member function PerlCreate,
  255.            which calls perl_alloc and perl_construct
  256.         4) call the CPerlHost member function PerlParse
  257.         5) call the CPerlHost member function PerlRun
  258.         6) call any of the perl_call_* functions
  259.         7) when done, call the CPerlHost member function PerlDestroy,
  260.            which calls perl_destruct and perl_free
  261.         
  262.         Including XSUB.h brings in the files that have macros to redefine the
  263.         perl_* functions, to work with PERL_OBJECT. Note that these macros may
  264.         cause problems when there are name collisions. A common problem is
  265.         having a local variable that has the same name as a Perl function. To
  266.         track down these name collisions compile using '/P' option with VC++ so
  267.         that you can see what the preprocessor has done.
  268.         
  269.     */
  270.     
  271.     #include <EXTERN.h>
  272.     #include <perl.h>
  273.     
  274.     #define NO_XSLOCKS
  275.     
  276.     // Bring in the macros that redefine perl_* functions to work with
  277.     // PERL_OBJECT.
  278.     //
  279.     #include <XSUB.h>
  280.     
  281.     /* for Win32 */
  282.     #include "win32iop.h"
  283.     #include <fcntl.h>
  284.     #include <perlhost.h>
  285.     
  286.     // DynaLoader stuff.
  287.     //
  288.     char *staticlinkmodules[] = {
  289.         "DynaLoader",
  290.         NULL,
  291.     };
  292.     
  293.     // More DynaLoader stuff.
  294.     //
  295.     EXTERN_C void boot_DynaLoader _((CV* cv _CPERLarg));
  296.     static void
  297.     xs_init(CPERLarg)
  298.     {
  299.         char *file = __FILE__;
  300.         dXSUB_SYS;
  301.         newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file);
  302.     }
  303.     
  304.     CPerlObj *pPerl;
  305.     
  306.     static void
  307.     PerlPower(int a, int b)
  308.     {
  309.         dSP;                            /* initialize stack pointer      */
  310.         ENTER;                          /* everything created after here */
  311.         SAVETMPS;                       /* ...is a temporary variable.   */
  312.         PUSHMARK(SP);                   /* remember the stack pointer    */
  313.         XPUSHs(sv_2mortal(newSViv(a))); /* push the base onto the stack  */
  314.         XPUSHs(sv_2mortal(newSViv(b))); /* push the exponent onto stack  */
  315.         PUTBACK;                        /* make local stack pointer global */
  316.         perl_call_pv("expo", G_SCALAR); /* call the function             */
  317.         SPAGAIN;                        /* refresh stack pointer         */
  318.                                         /* pop the return value from stack */
  319.     
  320.         printf ("%d to the %dth power is %d.\n", a, b, POPi);
  321.         PUTBACK;
  322.         FREETMPS;                       /* free that return value        */
  323.         LEAVE;                          /* ...and the XPUSHed "mortal" args.*/
  324.     }
  325.     
  326.     int main (int argc, char **argv, char **env)
  327.     {
  328.         CPerlHost host;
  329.     
  330.         host.PerlCreate();
  331.     
  332.         // Don't use argv or argc for embedding.  Instead, we'll pretend that
  333.         // we gave it the arguments "-e 0".
  334.         //
  335.         char *embedding[] = { "", "-e", "0" };
  336.         host.PerlParse(xs_init, 3, embedding, NULL);
  337.     
  338.         // Define the expo() function.
  339.         //
  340.         perl_eval_pv("sub expo { my($a, $b) = @_; return $a ** $b; }", TRUE);
  341.     
  342.         host.PerlRun();
  343.     
  344.         PerlPower(3, 4);                      /*** Compute 3 ** 4 ***/
  345.     
  346.         host.PerlDestroy();
  347.         return 0;
  348.     }
  349. </PRE>
  350. <P>The following <EM>Makefile</EM> can be used to compile <EM>PerlPower.cpp</EM>:</P>
  351. <PRE>
  352.     LIBDIR = C:\Perl\5.00468\lib\MSWin32-x86\CORE
  353.     SRCDIR = C:\betab9\src
  354.     
  355.     LIBS = oldnames.lib kernel32.lib user32.lib winspool.lib advapi32.lib \
  356.            shell32.lib ole32.lib  oleaut32.lib netapi32.lib uuid.lib \
  357.            wsock32.lib version.lib PerlCRT.lib $(LIBDIR)\PerlCore.lib
  358.     
  359.     CCFLAGS = -c -I$(LIBDIR) -Gf -W3 -DWIN32 -D_CONSOLE -DPERL_CORE \
  360.               -O2 -MD -DNDEBUG -TP -GX -DPERL_OBJECT -UPERLDLL
  361.     CCDYNA = $(CCFLAGS) -I$(SRCDIR)\ext\DynaLoader
  362.     
  363.     all:
  364.         cl.exe $(CCFLAGS) -Fo.\PerlPower.obj PerlPower.cpp
  365.         cl.exe $(CCFLAGS) -Fo.\win32.obj $(SRCDIR)\win32\win32.c
  366.         cl.exe $(CCFLAGS) -Fo.\win32sck.obj $(SRCDIR)\win32\win32sck.c
  367.         cl.exe $(CCFLAGS) -Fo.\DynaLoader.obj \
  368.                           $(SRCDIR)\ext\DynaLoader\DynaLoader.c
  369.         link.exe -nologo -nodefaultlib -release -machine:x86 $(LIBS) \
  370.             -subsystem:console PerlPower.obj win32.obj win32sck.obj \
  371.             DynaLoader.obj setargv.obj
  372. </PRE>
  373. <P>As with the <EM>MyPerl.cpp</EM> example <EM>Makefile</EM>, be sure that <CODE>SRCDIR</CODE> and <CODE>LIBDIR</CODE>
  374. point to the correct directories. You can compile <EM>PerlPower.cpp</EM> by typing <CODE>nmake</CODE>
  375. at the command line (make sure that both <EM>PerlPower.cpp</EM> and <EM>Makefile</EM> are in your
  376. current working directory). This will produce the file <EM>PerlPower.exe</EM>, which you can run at
  377. the command line:</P>
  378. <PRE>
  379.     C:\PerlPower>PerlPower
  380.     3 to the 4th power is 81.
  381. </PRE>
  382. <P>You should definitely read the perlembed document in its entirety to get an overview of the
  383. issues involved with embedding Perl. Then, you can use the <EM>MyPerl.cpp</EM> and <EM>PerlPower.cpp</EM>
  384. as guides for embedding ActivePerl.</P>
  385. <HR>
  386. <H2><A name="I_have_a_program_with_perl_embed">I have a program with perl embedded from the standard
  387. distribution. Why won't it compile with ActivePerl?</A></H2>
  388. <P>ActivePerl exposes the Perl interpreter in a slightly different fashion than standard Perl. For
  389. information on how to embed using ActivePerl, see <A href="#How_do_I_embed_the_Perl_interpre">How do
  390. I embed the Perl interpreter into my C/C++ program?</A>.</P>
  391. <HR>
  392. <H1><A name="AUTHOR_AND_COPYRIGHT">AUTHOR AND COPYRIGHT</A></H1>
  393. <P> </P>
  394. <P>This <FONT size="-1">FAQ</FONT> was originally assembled and maintained by Evangelo Prodromou. It
  395. has been revised and updated by Brian Jepson of O'Reilly & Associates, David Grove, David
  396. Dmytryshyn, and David Sparks of ActiveState.</P>
  397. <P>This <FONT size="-1">FAQ</FONT> is in the public domain. If you use it, however, please ensure
  398. that you give credit to the original authors. <!-- beginning of leaf footer-->
  399. </P>
  400. <TABLE border="0" cellpadding="0" cellspacing="0" width="100%">
  401.   <TR>
  402.     <TD class="block" valign="MIDDLE" width="100%" bgcolor="#cccccc"><FONT size="+1"><STRONG>
  403.       <P class="block"> ActivePerl FAQ</P>
  404.       </STRONG></FONT></TD>
  405.   </TR>
  406. </TABLE>
  407.     <!-- end of leaf footer-->
  408.  
  409. </BODY>
  410.  
  411. </HTML>
  412.