News:

MASM32 SDK Description, downloads and other helpful links
MASM32.com New Forum Link
masmforum WebSite

Missing export

Started by czDrillard, January 13, 2005, 04:56:18 PM

Previous topic - Next topic

czDrillard

Hello everybody,

My program uses SHGetFolderPath function.  This works on Windows XP and Windows 2000 but on Windows 98SE I get error dialog box with message: "The exe file is linked to missing export SHELL32.DLL:  SHGetFolderPathW"

The SDK says this function is implemented in a redistributable dynamic-link library (DLL), SHFolder.dll.  I linked to SHFolder.inc and copied SHFolder.dll to my Windows 98 System32 directory but still get error message.

Anybody get this function working on 98?  Any links, or suggestions much appreciated.

best regards,

czDrillard

jimh

It sounds as if you are trying to use a UNICODE function on Win98 (which it doesn't support), but I looked at the \masm32\include\shfolder.inc file and if you use SHGetFolderPath, then it equates to SHGetFolderPathA which IS supported and shouldn't give you that particular error.  If you call the SHGetFolderPathW function then I'd see the reason for the error.

I admit I don't know much about compiling for a UNICODE app...all of my experience has stayed withing ANSI and if I absolutely needed to call a UNICODE function I converted the data to/from ANSI/UNICODE and worked from there.

czDrillard

Thanks for your reply jimh.  My call looks like this:invoke SHGetFolderPath,NULL,CSIDL_RECENT ,NULL,SHGFP_TYPE_CURRENT,ADDR FullPathBuf

Not using unicode.

best regards,

czDrillard


P1

Humor me on this and try out a theory.

Build the project on the W98 machine and test on the W2X machine.

Regards,  P1  :8)

PS:  I no longer have a software developement W98 system at work any more.  At Home, yes.

MichaelW

QuoteI linked to SHFolder.inc and copied SHFolder.dll to my Windows 98 System32 directory but still get error message.
For Windows 98 it should be the  System directory, and on my Windows 98 SE, SHFOLDER.DLL version 5.00.2614.3500 is already there. But I have doubts that this is your problem.



eschew obfuscation

donkey

I did a scan of all my programs and I have *alot* of file manipulation and explorer type test programs and I cannot find a single instance where I used that function. I seem to remember having problems with it but on NT4/95 so I dumped it in favour of the more drawnout version...

invoke SHGetSpecialFolderLocation,NULL,[csidl],offset PIDL
invoke SHGetPathFromIDListA,[PIDL],offset szPath


In essence it does the same thing but it is NT4/95 compatible without any particular version of IE installed. I have tested this on both of those OSes without a problem. Note that I usually use a 32 DWORD buffer for PIDL.

You may also want to try to load it directly using LoadLibrary/GetProcAddress to see if it is a problem with the import library.
"Ahhh, what an awful dream. Ones and zeroes everywhere...[shudder] and I thought I saw a two." -- Bender
"It was just a dream, Bender. There's no such thing as two". -- Fry
-- Futurama

Donkey's Stable

MichaelW

Built and worked OK under Windows 2000 (C:\Documents and Settings\Administrator\Recent), and worked OK under Windows 98 SE (C:\WINDOWS\Recent).

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

    .486                       ; create 32 bit code
    .model flat, stdcall       ; 32 bit memory model
    option casemap :none       ; case sensitive

    include \masm32\include\windows.inc
    include \masm32\include\masm32.inc
    include \masm32\include\kernel32.inc
    include \masm32\include\shfolder.inc

    includelib \masm32\lib\masm32.lib
    includelib \masm32\lib\kernel32.lib
    includelib \masm32\lib\shfolder.lib

    include \masm32\macros\macros.asm

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

    .data
      FullPathBuf db 260 dup(0)
    .code

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

start:

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

    SHGFP_TYPE_CURRENT equ 0 ; current value for user, verify it exists
    SHGFP_TYPE_DEFAULT equ 1 ; default value, may not exist

    invoke SHGetFolderPath,
                            NULL,
                            CSIDL_RECENT,
                            NULL,
                            SHGFP_TYPE_CURRENT,
                            ADDR FullPathBuf
    print ADDR FullPathBuf

    mov   eax, input(13,10,"Press enter to exit...")
    exit

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

end start

eschew obfuscation

donkey

Hi,

Forgot to show you how to free the PIDL, it must be freed using the Shells IMalloc interface but there is a function for that in XP+ that is also available as an ordinal in all OS versions...

(ILFree by ordinal)
invoke Shell32.dll:155, [PIDL]
"Ahhh, what an awful dream. Ones and zeroes everywhere...[shudder] and I thought I saw a two." -- Bender
"It was just a dream, Bender. There's no such thing as two". -- Fry
-- Futurama

Donkey's Stable

czDrillard

Big thanks to everybody for replies  :U

Donkey, beleive or not I originally was using those two functions but switched for simplicity (no piddlin around :wink )  I can always go back to them but rather not.

MichaelW, your code is very interesting, I compiled it and ran it under xp no problems, compiled and ran under 98SE again no problem.  Strange...   I noticed my program which wouldn't run had a lot of includes.  So I added shell32.inc and shell32.lib to your code and the error message was generated.  Seems to be some conflict with the includes.  Maybe loads shell32 and ignores SHfolder.  This gets weirder.  If shell32 inc and lib is before shfolder inc and lib files, error is generated.  If shell32 is after shfolder inc and lib, no error ??

Any ideas?  don't really matter my program runs now but this is strange, no?


best regards,

czDrillard

pbrennick

Actually, when you think about it, with all the different DLLs in windows being created by so many different individuals, it is a wonder that this type of thing does not happen more often.
Paul

MichaelW

#10
I see now I misunderstood your first post :red

It looks like the problem is the include files and/or MASM32 libraries. The three declarations in shfolder.inc:

SHGetFolderPathA PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
SHGetFolderPath equ <SHGetFolderPathA>
SHGetFolderPathW PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD

Are also in shell32.inc. I suspect you could correct the problem under Windows 98 SE by just deleting the shfolder includes.


eschew obfuscation