Korzystanie z zewnętrznych plików w DLL

0

Witam,
Piszę bibliotekę DLL i potrzebuję skorzystać w niej z plików zewnętrznych, dokładnie z czcionek w formacie .ttf.
Jeśli korzystam z nich normalnie w programie to ok, ale jeśli chce w bibliotece zaimportować czcionkę, to dostaję błąd, invalid handle.
Czytałem gdzieś, że wystarczy wrzucić pliki do "Resources Files", ale nic to nie dało.
Czy trzeba zrobić coś jeszcze?
Visual Studio.
Pozdrawiam!

0

Może tak, może nie. Za mało szczegółów...

0

Jakich szczegółów potrzeba?

W konstruktorze klasy A korzystam z biblioteki podofo, aby stworzyć plik, a później utworzyć czcionki, wygląda to mniej więcej tak:

A(const wstring & cFilePath)
{
     pDocument = &PdfStreamedDocument(cFilePath);
     pFont = pDocument->CreateFontSubset("AbhayaLibre-Regular", false, false, false, new PdfIdentityEncoding(0, 0xffff, true), "fonts\\AbhayaLibre-Regular.ttf");
     pHeaderFont = pDocument->CreateFontSubset("AbhayaLibre-Bold", false, false, false, new PdfIdentityEncoding(0, 0xffff, true), "fonts\\AbhayaLibre-Bold.ttf");
}

Folder fonts\ mam w projekcie dllki i projekcie programu, który z dllki korzysta. Do projektu dll dorzuciłem do Resources Files te dwie czcionki.

Jeszcze pytanie poza tematem:
Czy jeśli w klasie mam:

PdfStreamedDocument* pDocument;

To w konstruktorze mogę stworzyć nowy obiekt tak jak to zrobiłem i czym to się różni od

pDocument = new PdfStreamedDocument(cFilePath);

Problem z biblioteką PoDoFo jest taki, że w niektórych funkcjach jako argumenty przyjmuje wskaźnik do obiektu, dlatego lepiej się operuje na wskaźnikach, ale naczytałem się ostatnio, że stosowanie new i delete to zła praktyka, dlatego zastanawiam się czy tak jak ja to robię jest dobrze.

1

pDocument = &PdfStreamedDocument(cFilePath);


To jest ewidentnie źle.

> ```cpp 
pDocument = new PdfStreamedDocument(cFilePath);

To jest dobrze.

Bardziej pr0 i po c++'owemu byłoby użyć smart pointerów:

// zamiast wskaźnika
std::unique_ptr<PdfStreamedDocument> Document;

...
// w konstruktorze
Document = std::make_unique<PdfStreamedDocument>(cFilePath);

pFont = Document->CreateFontSubset(...);

Tam, gdzie jakaś funkcja chce wskaźnika, dajesz Document.get(), a tam, gdzie referencji/wartości - *Document.

0

Tak dokładnie powinno być z tego co widzę, dzięki!

pDocument = std::make_unique<PdfStreamedDocument>(cFilePath);

Gdzie te pliki z czcionkami muszę dodać? Bo jak dodam tylko do Resources Files w bibliotece to dalej to samo. Widzę, że muszą one fizycznie znajdować się w folderze z projektem aplikacji korzystającej z dll-ki. Dobrze myślę? Nie da się ich jakoś wcielić do dllki? PoDoFo ma kilka czcionek, a nie muszę żadnych zewnętrznych plików używać.

0

Tak dokładnie powinno być (...)

Tak, pisałem na szybko i pominąłem typ przy make_unique. Zdarza się...

Gdzie te pliki z czcionkami muszę dodać?

Aplikacja odpalana pod kontrolą debuggera może mieć ustawiony inny katalog roboczy. Możesz poszukać w opcjach projektu, czy nie ma możliwości ustawienia katalogu roboczego, ewentualnie daj pełne ścieżki do czcionek, a nie względne.

Nie da się ich jakoś wcielić do dllki?

Da się jako zasób. Pytanie tylko, czy ta biblioteka umożliwia ładowanie fontów z zasobów.

0

Poszukałem trochę w internecie ale dalej mam problem.
Mam plik .rc

IDR_FONT1               FONT                    "fonts\\AbhayaLibre-Bold.ttf"

IDR_FONT2               FONT                    "fonts\\AbhayaLibre-Regular.ttf"

i plik .h :

#define IDR_FONT1                       101
#define IDR_FONT2                       102

w wcześniej wspomnianym konstruktorze daję:

	pFont = pDocument->CreateFontSubset("AbhayaLibre-Regular", false, false, false, new PdfIdentityEncoding(0, 0xffff, true), MAKEINTRESOURCEA(IDR_FONT1));

Dla odmiany teraz program mi się wywala i dostaję błąd: Access violation reading location na powyższej linijce.
Jest w stanie ktoś pomóc? Jeśli się tego nie da zrobić, to spoko. Jakoś inaczej to rozwiążę, aczkolwiek jeszcze będę próbował.

0x666 napisał(a):

Da się jako zasób. Pytanie tylko, czy ta biblioteka umożliwia ładowanie fontów z zasobów.

Chyba, że tak jak mówisz, to jest problemem. Hmm...

0

A co dokumentacja mówi o CreateFontSubset? Jest tam coś na temat ładowania czcionki z zasobów?

0

Nie ma nic. Zapytam ludzi, którzy tworzą tę bibliotekę, może pomogą :)

0

On Tue, 2017-04-04 at 21:47 +0200, [email protected] wrote:

When I try to use it in program, i got Access violation reading location error on the line above.

Hi,
PoDoFo::CreateFontSubset() defines as its last argument:
\param pszFileName optional path of a font file which should be used

Thus it expects a path for the font file, not font data as such. I
understood from your text that you embed as a resource the font file
into your executable or dll file, not only the path to it. Am I right?

PoDoFo itself has absolutely no idea about Windows executable/dll
resources. Even it has some API dedicated to WIN32, it doesn't deal
with resources of this kind.

You might want to consult some web search engine to get good examples
how to store data to executable/dll resources and how to get them out
of it (even Microsoft MSDN has good documentation and examples), but if
you still want to load font data (not font file) into PoDoFo, then you
want to change PoDoFo accordingly too, like to not use FT_New_Face(),
but FT_New_Memory_Face() or similar function to create the font loaded
in memory.
Bye,
zyx

Taką odpowiedź dostałem. Będę próbował coś pokombinować, może jutro nawet.

0

A nie możesz normalnie załadować fontów z zasobów DLL/EXE przez WinAPI i przekazać je dalej do biblioteki?

1 użytkowników online, w tym zalogowanych: 0, gości: 1