Здравствуйте, Walth, Вы писали:
W>Я конечно виноват, что сразу не сказал, у меня есть DLL сделанный на Делфи, но у меня нет его исходников. Есть также интерфейсный файл для этой DLL тоже написанный на Делфи.
Берётся Delphi той же версии, которой скомпилирована DLL. Пишется DLL-обёртка с правильным C-интерфейсом. Опционально над этой обёрточной DLL пишется ещё C++-обёртка, возвращающая std::string.
Либо делается извратный изврат, основанный на знании внутреннего строения ShortString и того, как он возвращается из Delphi-функций. Например, такой:
#pragma pack(push)
#pragma pack(1)
class ShortString
{
private:
unsigned char length;
char characters[256]; // 255 + terminating zero
public:
const char* c_str() const { characters[length] = 0; return &characters[0]; }
size_t size() const { return length; }
char& operator[](size_t i) { return characters[i]; }
char operator[](size_t i) const { return characters[i]; }
// вложенные типы и функции контейнеров — begin, end и т. д. по вкусу
};
#pragma pack(pop)
typedef void (__stdcall *pfErrorMsg)(int ErrNo, ShortString* Result);
[…]
void use(const char*);
pfErrorMsg clErrorMsg = …;
ShortString ss;
(*clErrorMsg)(42, &ss);
use(ss.c_str());