[mpich-discuss] problem of calling .dll in mpich

Jayesh Krishna jayesh at mcs.anl.gov
Fri Dec 5 17:01:17 CST 2008

 Can you also try whether the program runs fine with the "-localroot"
option ?


From: Vivian [mailto:viviantj at gmail.com] 
Sent: Friday, December 05, 2008 11:30 AM
To: Jayesh Krishna
Cc: mpich-discuss at mcs.anl.gov
Subject: Re: [mpich-discuss] problem of calling .dll in mpich

      I attached the sample test program which fails to call dll when it
is run by "mpiexec -n 1 application name". 
     (Btw, when using "mpiexec -localonly application name", dll can be
The DLL called in the program is 
a Dynamic Link Library (DLL) provided by ArcView ( a GIS software) for use
with WinHelp that lets you run a script. The DLL contains two functions
that you can use as WinHelp macros. 

AVRun -- this macro sends an Avenue statement from Help to ArcView. For
example, you might send a statement to make a particular view the active
document or run a script contained in the current project.

AVScript -- this macro runs a given script regardless of what ArcView
project is open. The script, in this case, is stored as part of the Help
file and not in an ArcView project.

Here's how you could run a script in the current ArcView project file and
pass an argument to it. In this case, the number 5 is passed as an
argument to a script, named script1, in the project:
AVRun(`av.Run("script1", 5)') 

      Here is the sample test code

#include <windows.h> 

/*Some users may get error messages such as
        SEEK_SET is #defined but must not be for the C++ binding of MPI
   The problem is that both stdio.h and the MPI C++ interface use
   This is really a bug in the MPI-2 standard. You can try adding the
following three lines before mpi.h is included
#undef SEEK_SET
#undef SEEK_END
#undef SEEK_CUR
#include "mpi.h"

typedef char (__stdcall *AVRUN) (char[100]); 

int main(int argc,char **argv)

    //load avhelp.dll 
    ArcviewDLL= LoadLibraryA("Avhelp.dll");    //It needs a Unicode
string. Therefore, we use LoadLibraryA() instead of LoadLibrary()  
    if (ArcviewDLL==NULL)
        printf("cannot load the Avhelp.dll.\n");
        printf("Make sure that the Avhelp.dll is in your \\windows\\system
               "directory or in the program's directory.\n");

    //get the adress of the AVRun function 
    AVRun = (AVRUN) GetProcAddress(ArcviewDLL, "AVRun");

    //================================== Start MPI
    //MPI : Declar Variables
    int my_rank;                                // Rank of process 
    int num_proc;                                // Number of processers
    //MPI : Initialize
    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
    MPI_Comm_size(MPI_COMM_WORLD, &num_proc);

    // -------- master Program ----------------//
    if (my_rank==0)     // Master processor
        //-------------Start call dll --------------//      
        ArcviewDLL= LoadLibraryA("Avhelp.dll");   
        AVRun = (AVRUN) GetProcAddress(ArcviewDLL, "AVRun");
        std::cout<<"Start Calling DLL"<<std::endl;
        std::cout<<"End Calling DLL"<<std::endl;

        //-------------End call dll---------------//

    // --------slave Program ------------------//


    //================================ End MPI
    return 0;



On Fri, Dec 5, 2008 at 10:03 AM, Jayesh Krishna <jayesh at mcs.anl.gov>

 Can you send us a sample test program that fails ?


From: mpich-discuss-bounces at mcs.anl.gov
[mailto:mpich-discuss-bounces at mcs.anl.gov] On Behalf Of Vivian
Sent: Friday, December 05, 2008 12:05 AM
To: mpich-discuss at mcs.anl.gov
Subject: [mpich-discuss] problem of calling .dll in mpich

      I met some problems when I was trying to call a dll in a mpich
program (Language:VS 2005).
      (1) MPICH seems to only support calling convention  _cdecl. 
          When I change the project setting to _stdcall, the code cannot
be successfully built.
          So I set the project setting back to _cdecl and force the
calling convention of the function pointer to my function on the DLL to be
"_stdcall". This time the program is built. 
          Under debugging mode or directly run in command window (
c:>test.ext), there is no problem to call dll in the code.
          Here is the code:
     typedef char (__stdcall *AVRUN) (char[100]);  
     HINSTANCE ArcviewDLL;  
     AVRUN AVRun;
     ArcviewDLL= LoadLibraryA("Avhelp.dll");    
     AVRun = (AVRUN) GetProcAddress(ArcviewDLL, "AVRun");


      (2) However, the program fails to call dll when I use "mpiexec" to
run it. (c:>mpiexec -n 1 test.exe).
           It seems to "stop" right before this line
          Is there anyone having any idea why this happens?


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/mpich-discuss/attachments/20081205/f723b2a8/attachment.htm>

More information about the mpich-discuss mailing list