Jump to page: 1 2
Thread overview
string vs. w/char*
Feb 28, 2011
Tyro[a.c.edwards]
Feb 28, 2011
Tyro[a.c.edwards]
Feb 28, 2011
J Chapman
Feb 28, 2011
Andrej Mitrovic
Feb 28, 2011
Tyro[a.c.edwards]
Feb 28, 2011
Denis Koroskin
Feb 28, 2011
Tyro[a.c.edwards]
Mar 01, 2011
Denis Koroskin
Mar 01, 2011
Tyro[a.c.edwards]
Mar 01, 2011
Bekenn
Mar 01, 2011
Tyro[a.c.edwards]
Mar 03, 2011
Tyro[a.c.edwards]
Mar 04, 2011
Kagamin
Mar 04, 2011
Kagamin
February 28, 2011
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;
}
February 28, 2011
On Mon, 28 Feb 2011 07:34:39 -0500, Tyro[a.c.edwards] <nospam@home.com> wrote:

> 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
February 28, 2011
On 2/28/2011 9:58 PM, Steven Schveighoffer wrote:
> On Mon, 28 Feb 2011 07:34:39 -0500, Tyro[a.c.edwards] <nospam@home.com>
> wrote:
>
>> 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

Both implementations results in error code 1812 being returned from GetLastError. explanation of the code reads:

     ERROR_RESOURCE_DATA_NOT_FOUND
     1812 (0x714)
     The specified image file did not contain a resource section.

The code I'm porting initially consisted of a resource.h file, a generic.rc file and two icons. I have not tried to include the icons and generic.rc file in the compilation because I do not know how to as yet and I've only used half of the resource.h file: didn't think I need the whole thing. Could this be the reason for the error? If so could you direct me to the explanation of how to prepare these files for inclusion in the compilation process?

Thanks,
Andrew
February 28, 2011
On Mon, 28 Feb 2011 08:30:02 -0500, Tyro[a.c.edwards] <nospam@home.com> wrote:

> On 2/28/2011 9:58 PM, Steven Schveighoffer wrote:
>> On Mon, 28 Feb 2011 07:34:39 -0500, Tyro[a.c.edwards] <nospam@home.com>
>> wrote:
>>
>>> 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
>
> Both implementations results in error code 1812 being returned from GetLastError. explanation of the code reads:
>
>       ERROR_RESOURCE_DATA_NOT_FOUND
>       1812 (0x714)
>       The specified image file did not contain a resource section.
>
> The code I'm porting initially consisted of a resource.h file, a generic.rc file and two icons. I have not tried to include the icons and generic.rc file in the compilation because I do not know how to as yet and I've only used half of the resource.h file: didn't think I need the whole thing. Could this be the reason for the error? If so could you direct me to the explanation of how to prepare these files for inclusion in the compilation process?
>

No clue, sorry.  I build D mostly on linux, on windows only when I have to.  Look on digitalmars.com for Windows programming.  Or try google.

-Steve
February 28, 2011
== Quote from Tyro[a.c.edwards] (nospam@home.com)'s article
> Both implementations results in error code 1812 being returned from
> GetLastError. explanation of the code reads:
>       ERROR_RESOURCE_DATA_NOT_FOUND
>       1812 (0x714)
>       The specified image file did not contain a resource section.
> The code I'm porting initially consisted of a resource.h file, a
> generic.rc file and two icons. I have not tried to include the icons and
> generic.rc file in the compilation because I do not know how to as yet
> and I've only used half of the resource.h file: didn't think I need the
> whole thing. Could this be the reason for the error? If so could you
> direct me to the explanation of how to prepare these files for inclusion
> in the compilation process?
> Thanks,
> Andrew

You need to compile the .rc file (see http://www.digitalmars.com/ctg/rcc.html), then add the resulting .res file to dmd's command line.
February 28, 2011
I've successfully used resource files with DFL. Maybe this will help: http://www.dsource.org/forums/viewtopic.php?t=5591&sid=bf2d804f1d5a3f9efccbf29ebb6cf723

You'll have to dig into the DFL library sources to find out exactly how it loads a resource file though.
February 28, 2011
On 2/28/2011 11:08 PM, J Chapman wrote:
> == Quote from Tyro[a.c.edwards] (nospam@home.com)'s article
>> Both implementations results in error code 1812 being returned from
>> GetLastError. explanation of the code reads:
>>        ERROR_RESOURCE_DATA_NOT_FOUND
>>        1812 (0x714)
>>        The specified image file did not contain a resource section.
>> The code I'm porting initially consisted of a resource.h file, a
>> generic.rc file and two icons. I have not tried to include the icons and
>> generic.rc file in the compilation because I do not know how to as yet
>> and I've only used half of the resource.h file: didn't think I need the
>> whole thing. Could this be the reason for the error? If so could you
>> direct me to the explanation of how to prepare these files for inclusion
>> in the compilation process?
>> Thanks,
>> Andrew
>
> You need to compile the .rc file (see
> http://www.digitalmars.com/ctg/rcc.html), then add the resulting .res file
> to dmd's command line.

Awesome, this does the trick. However I get get a "GP Fault"? during execution. Using windbg, I tracked it down to this piece of code:

void Create()
{
  _hwnd = CreateWindowExA(
    _exStyle,
    cast(const(char*))_wc.GetName(), // returns string
    cast(const(char*))_windowName,   // string variable
    _style,
    _x,
    _y,
    _width,
    _height,
    _hWndParent,
    _hMenu,
    _wc.GetInstance(),
    _data);

    assert(_hwnd, "Internal error: Window Creation Failed.");
}

The program craps at assert() but the error is generated. It just displays a dialog box with the message: "test.exe has stopped working, Windows is checking for a solution to the problem..."

I'm thinking that _hwnd was never initialized and that assert is access a null pointer but I cannot be sure. Any suggestions or ideas?
February 28, 2011
On Mon, 28 Feb 2011 19:35:47 +0300, Tyro[a.c.edwards] <nospam@home.com> wrote:

> On 2/28/2011 11:08 PM, J Chapman wrote:
>> == Quote from Tyro[a.c.edwards] (nospam@home.com)'s article
>>> Both implementations results in error code 1812 being returned from
>>> GetLastError. explanation of the code reads:
>>>        ERROR_RESOURCE_DATA_NOT_FOUND
>>>        1812 (0x714)
>>>        The specified image file did not contain a resource section.
>>> The code I'm porting initially consisted of a resource.h file, a
>>> generic.rc file and two icons. I have not tried to include the icons and
>>> generic.rc file in the compilation because I do not know how to as yet
>>> and I've only used half of the resource.h file: didn't think I need the
>>> whole thing. Could this be the reason for the error? If so could you
>>> direct me to the explanation of how to prepare these files for inclusion
>>> in the compilation process?
>>> Thanks,
>>> Andrew
>>
>> You need to compile the .rc file (see
>> http://www.digitalmars.com/ctg/rcc.html), then add the resulting .res file
>> to dmd's command line.
>
> Awesome, this does the trick. However I get get a "GP Fault"? during execution. Using windbg, I tracked it down to this piece of code:
>
> void Create()
> {
>    _hwnd = CreateWindowExA(
>      _exStyle,
>      cast(const(char*))_wc.GetName(), // returns string
>      cast(const(char*))_windowName,   // string variable
>      _style,
>      _x,
>      _y,
>      _width,
>      _height,
>      _hWndParent,
>      _hMenu,
>      _wc.GetInstance(),
>      _data);
>
>      assert(_hwnd, "Internal error: Window Creation Failed.");
> }
>
> The program craps at assert() but the error is generated. It just displays a dialog box with the message: "test.exe has stopped working, Windows is checking for a solution to the problem..."
>
> I'm thinking that _hwnd was never initialized and that assert is access a null pointer but I cannot be sure. Any suggestions or ideas?

The

>  cast(const(char*))_wc.GetName()

line look *very* suspicious. You can't get a string and just cast it to const(char)*. Most importantly, the string (most likely) is not null-terminated.

What you need to do here is the following:

auto className = toStringz(_ws.GetName());
auto caption = toStringz(_windowName);

and pass those 2 to the function.

Alternatively, you could make sure your strings are null-terminated and pass the pointer directly (e.g. _windowName.ptr):

string _windowName = "foo"; // null-terminated automatically
string _caption = ("Hello, World" ~ "\0")[0..$-1]; // append trailing zero to an existing string but exclude it from result (so that it's not included in _caption.length)
February 28, 2011
== Quote from Denis Koroskin (2korden@gmail.com)'s article
> On Mon, 28 Feb 2011 19:35:47 +0300, Tyro[a.c.edwards]
<nospam@home.com>
> wrote:
> > On 2/28/2011 11:08 PM, J Chapman wrote:
> >> == Quote from Tyro[a.c.edwards] (nospam@home.com)'s article
> >>> Both implementations results in error code 1812 being
returned from
> >>> GetLastError. explanation of the code reads:
> >>>        ERROR_RESOURCE_DATA_NOT_FOUND
> >>>        1812 (0x714)
> >>>        The specified image file did not contain a resource
section.
> >>> The code I'm porting initially consisted of a resource.h
file, a
> >>> generic.rc file and two icons. I have not tried to include
the icons
> >>> and
> >>> generic.rc file in the compilation because I do not know how
to as yet
> >>> and I've only used half of the resource.h file: didn't think
I need the
> >>> whole thing. Could this be the reason for the error? If so
could you
> >>> direct me to the explanation of how to prepare these files
for
> >>> inclusion
> >>> in the compilation process?
> >>> Thanks,
> >>> Andrew
> >>
> >> You need to compile the .rc file (see
> >> http://www.digitalmars.com/ctg/rcc.html), then add the
resulting .res
> >> file
> >> to dmd's command line.
> >
> > Awesome, this does the trick. However I get get a "GP Fault"?
during
> > execution. Using windbg, I tracked it down to this piece of
code:
> >
> > void Create()
> > {
> >    _hwnd = CreateWindowExA(
> >      _exStyle,
> >      cast(const(char*))_wc.GetName(), // returns string
> >      cast(const(char*))_windowName,   // string variable
> >      _style,
> >      _x,
> >      _y,
> >      _width,
> >      _height,
> >      _hWndParent,
> >      _hMenu,
> >      _wc.GetInstance(),
> >      _data);
> >
> >      assert(_hwnd, "Internal error: Window Creation Failed.");
> > }
> >
> > The program craps at assert() but the error is generated. It
just
> > displays a dialog box with the message: "test.exe has stopped
working,
> > Windows is checking for a solution to the problem..."
> >
> > I'm thinking that _hwnd was never initialized and that assert
is access
> > a null pointer but I cannot be sure. Any suggestions or ideas?
> The
> >  cast(const(char*))_wc.GetName()
> line look *very* suspicious. You can't get a string and just
cast it to
> const(char)*. Most importantly, the string (most likely) is not
> null-terminated.
> What you need to do here is the following:
> auto className = toStringz(_ws.GetName());
> auto caption = toStringz(_windowName);
> and pass those 2 to the function.

Actually I've already tried that, it has no effect on the outcome.
From your suggestion though, I've gone back and replace all the
cast(const(char*)) usage throughout the program. Final verdict:
the program still crashes it the same location. It actually never
returns from CreateWindowExA().

> Alternatively, you could make sure your strings are null-
terminated and
> pass the pointer directly (e.g. _windowName.ptr):
> string _windowName = "foo"; // null-terminated automatically
> string _caption = ("Hello, World" ~ "\0")[0..$-1]; // append
trailing zero
> to an existing string but exclude it from result (so that it's
not
> included in _caption.length)

March 01, 2011
On Tue, 01 Mar 2011 02:08:48 +0300, Tyro[a.c.edwards] <nospam@home.com> wrote:

> == Quote from Denis Koroskin (2korden@gmail.com)'s article
>> On Mon, 28 Feb 2011 19:35:47 +0300, Tyro[a.c.edwards]
> <nospam@home.com>
>> wrote:
>> > On 2/28/2011 11:08 PM, J Chapman wrote:
>> >> == Quote from Tyro[a.c.edwards] (nospam@home.com)'s article
>> >>> Both implementations results in error code 1812 being
> returned from
>> >>> GetLastError. explanation of the code reads:
>> >>>        ERROR_RESOURCE_DATA_NOT_FOUND
>> >>>        1812 (0x714)
>> >>>        The specified image file did not contain a resource
> section.
>> >>> The code I'm porting initially consisted of a resource.h
> file, a
>> >>> generic.rc file and two icons. I have not tried to include
> the icons
>> >>> and
>> >>> generic.rc file in the compilation because I do not know how
> to as yet
>> >>> and I've only used half of the resource.h file: didn't think
> I need the
>> >>> whole thing. Could this be the reason for the error? If so
> could you
>> >>> direct me to the explanation of how to prepare these files
> for
>> >>> inclusion
>> >>> in the compilation process?
>> >>> Thanks,
>> >>> Andrew
>> >>
>> >> You need to compile the .rc file (see
>> >> http://www.digitalmars.com/ctg/rcc.html), then add the
> resulting .res
>> >> file
>> >> to dmd's command line.
>> >
>> > Awesome, this does the trick. However I get get a "GP Fault"?
> during
>> > execution. Using windbg, I tracked it down to this piece of
> code:
>> >
>> > void Create()
>> > {
>> >    _hwnd = CreateWindowExA(
>> >      _exStyle,
>> >      cast(const(char*))_wc.GetName(), // returns string
>> >      cast(const(char*))_windowName,   // string variable
>> >      _style,
>> >      _x,
>> >      _y,
>> >      _width,
>> >      _height,
>> >      _hWndParent,
>> >      _hMenu,
>> >      _wc.GetInstance(),
>> >      _data);
>> >
>> >      assert(_hwnd, "Internal error: Window Creation Failed.");
>> > }
>> >
>> > The program craps at assert() but the error is generated. It
> just
>> > displays a dialog box with the message: "test.exe has stopped
> working,
>> > Windows is checking for a solution to the problem..."
>> >
>> > I'm thinking that _hwnd was never initialized and that assert
> is access
>> > a null pointer but I cannot be sure. Any suggestions or ideas?
>> The
>> >  cast(const(char*))_wc.GetName()
>> line look *very* suspicious. You can't get a string and just
> cast it to
>> const(char)*. Most importantly, the string (most likely) is not
>> null-terminated.
>> What you need to do here is the following:
>> auto className = toStringz(_ws.GetName());
>> auto caption = toStringz(_windowName);
>> and pass those 2 to the function.
>
> Actually I've already tried that, it has no effect on the outcome.
> From your suggestion though, I've gone back and replace all the
> cast(const(char*)) usage throughout the program. Final verdict:
> the program still crashes it the same location. It actually never
> returns from CreateWindowExA().
>
>> Alternatively, you could make sure your strings are null-
> terminated and
>> pass the pointer directly (e.g. _windowName.ptr):
>> string _windowName = "foo"; // null-terminated automatically
>> string _caption = ("Hello, World" ~ "\0")[0..$-1]; // append
> trailing zero
>> to an existing string but exclude it from result (so that it's
> not
>> included in _caption.length)
>

This is indeed strange, but it has nothing to do with the function itself. I still think the parameters you are passing might be invalid. Try setting them to default values and see if that helps. Also try wrapping the call with a try/catch block and output an exception you are getting (if any).
« First   ‹ Prev
1 2