[gdal-dev] How to use GDAL C++ dynamically?

Mikhail Tchernychev misha at mail.geometrics.com
Tue Feb 22 17:52:40 EST 2011


  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 at OGRSFDriverRegistrar@@SAPA
>> V1 at 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 at lists.osgeo.org
>> http://lists.osgeo.org/mailman/listinfo/gdal-dev



More information about the gdal-dev mailing list