Hi,

size_t is an incorrect size for DataLength (if you run on 32 bit architecture). You should use vsi_l_offset.

Besides that the following standalone inspired from your code works fine for me:

#include <stdio.h>
#include "gdal_priv.h"

int main()
{
    GDALAllRegister();
    GDALDataset* Dataset =GDALDataset::FromHandle(GDALOpenEx("poly.shp", GDAL_OF_VECTOR | GDAL_OF_VERBOSE_ERROR, nullptr, nullptr, nullptr));     GDALDataset* Copy = Dataset->GetDriver()->CreateCopy("/vsimem/foo.shp", Dataset, false, nullptr, nullptr, nullptr); //appears to produce a valid Dataset containing the same layers & features as its source.
    GDALClose(Dataset);
    GDALClose(Copy);
    vsi_l_offset DataLength = 0;
    GByte* Buffer = VSIGetMemFileBuffer("/vsimem/foo.shp", &DataLength, true);     printf("%p %d\n", Buffer, int(DataLength)); // buffer not null and DataLength > 0
    CPLFree(Buffer);
    VSIUnlink("/vsimem/foo.dbf");
    VSIUnlink("/vsimem/foo.shx");
    return 0;
}

Even

Le 04/10/2023 à 06:26, Soren Saville Scott via gdal-dev a écrit :
Hi,

I'm integrating GDAL in C++ with a system that defines its own asset types stored on disk, and am writing a wrapper for datasets using this asset system. To 'import' a dataset I call GDALOpenEx on it, CreateCopy() it to some "/vsimem/foo.shp" path, GDALClose() the datasets to flush it, and call VSIGetMemFileBuffer with bUnlinkAndSeize=true to take ownership of the underlying memory buffer.

GDALDataset* Dataset = GDALOpenEx("foo.shp", GDAL_OF_VECTOR | GDAL_OF_VERBOSE_ERROR, nullptr, nullptr, nullptr); GDALDataset* Copy = Dataset->GetDriver()->CreateCopy("/vsimem/foo.shp", Dataset, false, nullptr, nullptr, nullptr); //appears to produce a valid Dataset containing the same layers & features as its source.
GDALClose(Dataset);
GDALClose(Copy);
size_t DataLength;
GByte* Buffer = VSIGetMemFileBuffer("/vsimem/foo.shp", &DataLength, true); //<-- returns NULL

For some reason VSIGetMemFileBuffer always fails, returning a nullptr. This is basically identical to a similar problem I had, described here: https://stackoverflow.com/questions/73644157/get-raw-buffer-for-in-memory-dataset-in-gdal-c-api <https://stackoverflow.com/questions/73644157/get-raw-buffer-for-in-memory-dataset-in-gdal-c-api> which I never really found a solution to. I have similar issues with other VSI functions, e.g. calling GDALOpenEx on a path created by VSIFileFromMemBuffer also fails.

Any idea as to what the problem is here?

Alternatively, maybe there's a better way to 'emplace' datasets inside some other file?

Thanks,
Soren Saville Scott

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

--
http://www.spatialys.com
My software is free, but my time generally not.
_______________________________________________
gdal-dev mailing list
gdal-dev@lists.osgeo.org
https://lists.osgeo.org/mailman/listinfo/gdal-dev

Reply via email to