The bellow code attempts to use LoadStringA() to initialize _buf. However, regardless of what form _buf takes, the body of the if statement is always executed. I've attempted to use every type of string available in D to include char* _buf[MAX_RESSTRING+1] and setting _buf[MAX_RESSTRING] = '\0'; What am I doing incorrectly?Any assistance is greatly appreciated.class ResString { enum { MAX_RESSTRING = 255 } alias getBuffer this; @property string getBuffer() { return _buf; } this(HINSTANCE hInst, int resId) { _buf.length = MAX_RESSTRING; SetLastError(0);if(!LoadStringA(hInst, resId, cast(char*)toStringz(_buf), _buf.length + 1)){ throw new WinException("Load String failed"); } } private: string _buf; }
You should not be overwriting buf, it is immutable. You need to make a new buffer each time.
this(HINSTANCE hInst, int resId)
{
auto mybuf = new char[MAX_RESSTRING];
auto nchars = LoadStringA(hInst, resId, mybuf.ptr, mybuf.length);
if(!nchars)
{
throw new WinException("Load String failed");
}
_buf = assumeUnique(mybuf[0..nchars]);
SetLastError(0);
}
If this isn't working, you might consider that the string you are trying
to load doesn't actually exist (that is a valid condition). What is the
error from GetLastError ?
-Steve
