in reply to Re: A little help with Win32::API? (cleanup)
in thread A little help with Win32::API?

Thanks for the code - it's beautiful :) And it works.

Well, almost. The %INSTALLSTATE_DESC in your code gets initialized as { "INSTALLSTATE_NOTUSED" => "description", ... }, however MsiGetShortcutTarget() return integer. I guess the +INSTALLSTATE_NOTUSED hash init doesn't do what you intended on my machine (AS Perl 5.10.0, MSWin32, osvers=5.00, archname=MSWin32-x86-multi-thread) (I've never seen this technique)

Other improvements can be made to this code I noticed:

But I do get the path, and that's what I wanted to just quickly do.

Replies are listed 'Best First'.
Re^3: A little help with Win32::API? (cleanup)
by ikegami (Patriarch) on Apr 25, 2010 at 16:11 UTC

    I guess the +INSTALLSTATE_NOTUSED hash init doesn't do what you intended

    Fixed.

    szProduct and szComponent are UUIDs in brackets, so we can define constant for them as well to be 38 chars

    True. I just used the number because the documentation stated a number and not a constant.

    If I understand this correctly, MsiGetComponentPath() returns how successful the execution went

    I think you mean MsiGetShortcutTarget. I made the Perl version return an empty list on error. The reason for the error is available via $^E (0+$^E gives the code, ''.$^E gives the message).

    we supposed to call MsiGetComponentPath() only if it returns success (0).

    I do that. I don't know why you say this is an improvement to be made.

    But on Vista I also get 1603 when I try this with c#

    Not a problem. I figured the errors might not be limited to 1627. By using $^E, it's properly handled.

      thanks! I've learned a few new things in Perl with this thread...