I am trying to load a string resource using firstly FindResource and then LoadResource. This is the function I have defined to do it.
getRsrcString proc resStringID:DWORD, hMod:DWORD
; Find the resource string
invoke FindResource, hMod, resStringID, RT_STRING
; Get the resource string
invoke LoadResource, hMod, eax
ret
getRsrcString endp
The resStringID argument is defined in an equates. eg fileMaskEmpty equ 2000
This and other resource string equates refer to the following section of a resource file
// String resources
#define fileMaskEmpty 2000
#define fileMask1 2002
#define fileMask2 2003
#define fileMask3 2004
#define fileMask4 2005
#define fileMask5 2006
STRINGTABLE
BEGIN
fileMaskEmpty " "
fileMask1 "*.html"
fileMask2 "*.sql"
fileMask3 "*.txt"
fileMask4 "*.sql;*.txt"
fileMask5 "*.xml"
END
The call to FindResource is failing. I suspect this is because I am passing an integer in the lpName argument and not a LPCTSTR. The MSDN documentation recommends the MAKEINTRESOURCE macro as a way of translating from an integer value to a LPCTSTR value. However I have read a post by dedndave from July 03, 2014 in which he states...
" well, in the world of ASM, we don't really need to use a MAKEINTRESOURCE macro
what that text is really saying is
1) of lpMenuName is less than 65536, it's an integer identifier (600, in your case)
2) otherwise, it's the address of a null-terminated string (menu name) "
And this works a treat when I load an icon from a resource file by passing the resource identifier as an integer. Not so great when I try to load a string although in both cases their resource identifiers are less than 65536.
Thanks
Have you tried using LoadString?
Quote from: MSDN FindResource
An application can use FindResource to find any type of resource, but this function should be used only if the application must access the binary resource data by making subsequent calls to LoadResource and then to LockResource.
To use a resource immediately, an application should use one of the following resource-specific functions to find the resource and convert the data into a more usable form.
LoadString will probably work for you, as Sinsi suggested
if you want a more "universal" routine that may be used for loading any type resource...
http://masm32.com/board/index.php?topic=967.0 (http://masm32.com/board/index.php?topic=967.0)
if you follow that thread, there are also routines for working with group resources
LoadString is easy to use (and works under the hood of Res$() (http://www.webalice.it/jj2006/MasmBasicQuickReference.htm#Mb1105)), BUT for your particular application, i.e. OPENFILENAME filters, beware of a nasty bug in the Unicode version of LoadString (http://masm32.com/board/index.php?topic=3509.msg36865#msg36865).
Hi IanScott,
Here is an example for you :
include \masm32\include\masm32rt.inc
BUFF_SIZE equ 32
IDS_STRING2 equ 2
.data?
buffer db BUFF_SIZE dup(?)
.code
start:
invoke GetModuleHandle,0
invoke LoadString,eax,IDS_STRING2,\
ADDR buffer,BUFF_SIZE
invoke StdOut,ADDR buffer
invoke ExitProcess,0
END start