Ошибка компоновщика, winapi, карманный компьютер

После некоторой борьбы с приложением, которое отображает время в ярлыке при нажатии кнопки, оно, наконец, привело к ошибке компоновщика.

Строка кода, которая вызывает это:

_wstrdate(dateStr);

Недостатки:

error LNK2019: unresolved external symbol _wstrdate referenced in function "long __cdecl WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YAJPAUHWND__@@IIJ@Z)
fatal error LNK1120: 1 unresolved externals

Мне сказали опубликовать мои настройки WNDPROC и линкера здесь:

  LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;

static HWND hButton;
static HWND hLabel;
static SHACTIVATEINFO s_sai;

switch (message) 
{
    case WM_COMMAND:
        wmId    = LOWORD(wParam); 
        wmEvent = HIWORD(wParam); 
        // Parse the menu selections:
        switch (wmId)
        {
            case IDM_HELP_ABOUT:
                DialogBox(g_hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, About);
                break;
 #ifdef WIN32_PLATFORM_PSPC
            case IDM_OK:
                SendMessage (hWnd, WM_CLOSE, 0, 0);             
                break;

            case 1001:
            {



                _wstrdate(dateStr);

                SetDlgItemTextW(hWnd, 1003, dateStr);


                break;
            }

#endif // WIN32_PLATFORM_PSPC
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
        }
        break;
    case WM_CREATE:
#ifdef SHELL_AYGSHELL
        SHMENUBARINFO mbi;

        memset(&mbi, 0, sizeof(SHMENUBARINFO));
        mbi.cbSize     = sizeof(SHMENUBARINFO);
        mbi.hwndParent = hWnd;
        mbi.nToolBarId = IDR_MENU;
        mbi.hInstRes   = g_hInst;

        hButton = CreateWindow( L"button",L"Time",
            WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,
            100,200,
            50,20,
            hWnd, (HMENU) MEDDELANDEBUTTON_ID,
             NULL, NULL);



        hLabel = CreateWindowW(L"STATIC",L"Time",
        WS_VISIBLE | WS_CHILD | SS_RIGHT,
        10,200,75,35,hWnd, (HMENU)1003, NULL, NULL);





        if (!SHCreateMenuBar(&mbi)) 
        {
            g_hWndMenuBar = NULL;
        }
        else
        {
            g_hWndMenuBar = mbi.hwndMB;
        }

        // Initialize the shell activate info structure
        memset(&s_sai, 0, sizeof (s_sai));
        s_sai.cbSize = sizeof (s_sai);
#endif // SHELL_AYGSHELL
        break;
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);

        // TODO: Add any drawing code here...

        EndPaint(hWnd, &ps);
        break;
    case WM_DESTROY:
 #ifdef SHELL_AYGSHELL
        CommandBar_Destroy(g_hWndMenuBar);
 #endif // SHELL_AYGSHELL
        PostQuitMessage(0);
        break;

    case WM_ACTIVATE:
        // Notify shell of our activate message
        SHHandleWMActivate(hWnd, wParam, lParam, &s_sai, FALSE);
        break;
    case WM_SETTINGCHANGE:
        SHHandleWMSettingChange(hWnd, wParam, lParam, &s_sai);
        break;

    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}

Также вот мои варианты компоновщика: (Стандартные visualstudio 2008)

/OUT:"Pocket PC 2003 (ARMV4)  \Debug/c++pocketpc.exe" /INCREMENTAL /NOLOGO /MANIFEST:NO /NODEFAULTLIB:"oldnames.lib" /DEBUG /PDB:"Pocket PC 2003 (ARMV4)\Debug/c++pocketpc.pdb" /STACK:65536,4096 /DYNAMICBASE:NO /ERRORREPORT:PROMPT coredll.lib corelibc.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib

1 ответ

Со страницы Microsoft на Control.WinProc,

Платформа

Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile для карманных ПК, Windows Mobile для смартфонов, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

Итак, вы там прикрыты.

Тем не менее, в .NET Framework Security я вижу

  • SecurityPermission для наследования классов для вызова неуправляемого кода. Связанное перечисление: SecurityPermissionFlag.UnmanagedCode.

  • SecurityPermission для непосредственного абонента, чтобы вызвать неуправляемый код. Связанное перечисление: SecurityPermissionFlag.UnmanagedCode.

Таким образом, похоже, что вам, возможно, придется обернуть свой код в небезопасный блок. Я так понимаю, ты уже это делаешь.

Информация, которую я нашел на _wstrdate, имеет это в примере кода:

// Примечание: _strdate устарела; рассмотреть возможность использования _strdate_s вместо

Раздел Эквивалент.NET Framework дает ссылку на System:: DateTime:: Parse, так что вы можете получить хорошие результаты, попробовав ее.

Надеюсь это поможет.

Другие вопросы по тегам