0

C++ MFC で以下の C# .net コードと同じことを行う必要があります。

using System;
using System.Text;
using System.Runtime.InteropServices;

namespace ConsoleApplication1
{
    class Program
    {
        [DllImport("shell32.dll", EntryPoint = "#261",
            CharSet = CharSet.Unicode, PreserveSig = false)]
        public static extern void GetUserTilePath(
          string username, 
          UInt32 whatever, // 0x80000000
          StringBuilder picpath, int maxLength);

        public static string GetUserTilePath(string username)
        {   // username: use null for current user
            var sb = new StringBuilder(1000);
            GetUserTilePath(username, 0x80000000, sb, sb.Capacity);
            return sb.ToString();
        }

        [STAThread]
        static void Main(string[] args)
        {
            string path =GetUserTilePath(null);
            Console.WriteLine("path = %s", path);
        }
    }
}

#261 (または 261) エントリ ポイントおよび/または C++ への正確な署名から GetProcAddress に到達できません。

編集:ここにトリックがあります

HMODULE shell32Dll= ::LoadLibrary(L"shell32.dll");


HRESULT (__stdcall *getUserImage)(LPCWSTR userName,
                        DWORD zero , LPWSTR outPath, UINT size);

(FARPROC&)getUserImage = ::GetProcAddress(shell32Dll, MAKEINTRESOURCEA(261));
if(getUserImage)
{
        WCHAR outPath[MAX_PATH];
        getUserImage(NULL,0x80000000,outPath,MAX_PATH);
}

"#261" や "261" の代わりに MAKEINTRESOURCE(261) を使用してください。

ありがとうございました!キャメロン!

4

1 に答える 1

0

GetProcAddr ドキュメントから:

lpProcName [in]
関数または変数の名前、または関数の序数値。このパラメーターが序数の値である場合は、下位ワードにある必要があります。上位ワードはゼロでなければなりません。

次のように呼び出す必要があることがわかりました。

(FARPROC&)getUserImage = ::GetProcAddress(shell32Dll, MAKEINTRESOURCE(261));
于 2012-04-26T18:47:22.997 に答える