This is what I normally do, however it's not much less pain, even it's simple. I typically write a wrapper to execute all GetProcAdress() functions at once and store
pointers in the class.

Taking into number of GDAL functions, its' would be very challenging.

Mikhail

On 2/22/2011 2:43 PM, Even Rouault wrote:
Le mardi 22 février 2011 23:14:50, Mikhail Tchernychev a écrit :
    Hello List,

I wonder if someone could point me into the right direction. I would
like to use
GDAL as loaded DLL at run time,  with LoadLibray()  call under windows
and corresponding
calls under Linux. I see that most of the functions are virtual, so it
seems it is made
with this in mind.  I am trying to compile simple program:
I think you are going to inflict you a lot of pain with LoadLibrary() and C++
API at the same time !

If you really need to dynamicly load gdal, use the GDAL C API instead...

#include "stdafx.h"
#include<windows.h>

#define CPL_DLL

#include "ogrsf_frmts.h"

typedef void (* pOGRRegisterAll)();
typedef OGRSFDriverRegistrar * (*pGetRegistar)();

int _tmain(int argc, _TCHAR* argv[])
{

      const char *pszDriverName = "ESRI Shapefile";
      HMODULE hDll = LoadLibrary("gdal18.dll");
      if(!hDll) {
              fprintf(stderr,"Cannot load library\n");
              exit(0);
      }


      pOGRRegisterAll pRegFunc =
(pOGRRegisterAll)GetProcAddress(hDll,"OGRRegisterAll");

      (*pRegFunc)();

      OGRSFDriver *poDriver;
      OGRSFDriverRegistrar * poRegistrar;

      pGetRegistar pRegistrarFunc =
(pGetRegistar)GetProcAddress(hDll,"?GetRegistrar@OGRSFDriverRegistrar@@SAPA
V1@XZ");

      if(pRegistrarFunc == NULL )
      {
          printf( "Cannot get registrar\n");
          exit( 1 );
      }

      poRegistrar = (*pRegistrarFunc)();

      if( poRegistrar == NULL )
      {
          printf( "Cannot get poRegistrar\n");
          exit( 1 );
      }

      // link error here:
      poDriver = poRegistrar->GetDriverByName(pszDriverName);

      if( poDriver == NULL )
      {
          printf( "%s driver not available.\n", pszDriverName );
          exit( 1 );
      }


      return 0;
}

This is just part of the GDAL API tutorial.

I see two problems here:

1. I have to use C++ mangled names, which is not very nice. Is there
.DEF file for GDAL
       with meaningful names?

2. I got a link error, which apparently clear why, because
GetDriverByName() is not virtual.
Now then could I create new files if GDAL is loaded dynamically?

I am using latest GDAL source with VC++ 2010

I tried to search mail list but did not seem find anything.

Thank you very much,

Mikhail

_______________________________________________
gdal-dev mailing list
gdal-dev@lists.osgeo.org
http://lists.osgeo.org/mailman/listinfo/gdal-dev

_______________________________________________
gdal-dev mailing list
gdal-dev@lists.osgeo.org
http://lists.osgeo.org/mailman/listinfo/gdal-dev

Reply via email to