Смешивание управляемого класса / типов с неуправляемым LNK2028: неразрешенный токен

Здравствуйте! Я пытаюсь создать форму, которая позволяет пользователю щелкнуть в графическом окне, чтобы импортировать изображение в графическое окно среди других функций. Проблема заключается в импорте, один из членов моей команды сделал код для импорта, но мы не можем заставить его работать со смешанным управляемым и неуправляемым кодом. Никто из нас не знает ничего об управляемом коде или неуправляемом коде, входящем в этот проект, поэтому мы не знаем, как заставить работать следующее.

Ниже у нас есть два метода: один для преобразования WChar в строку, другой открывает окно браузера для выбора изображения. Последние используют класс рисунка, который содержит несколько переменных, таких как путь и имя. Класс рисунков работает в других функциях и не может быть изменен. Аналогичная версия GetLogo() работает, когда не в визуальной студии (без изменений).

#pragma unmanaged
#include <windows.h>
#include <iostream>
#include <fstream>
#include <string>
#include <list>
#include <iomanip>
using namespace std;

#pragma managed
#include "Picture.h"
#include <list>
#using<system.dll>
using namespace System;
using namespace System::IO;
using namespace System::Collections::Generic;

static string importFiles = "Import Pictures";
static wstring importLogo = L"Import Logo";


System::String^ convertWCharToString(wchar_t buffer[])
{
    // Convert the wchar_t string to a char* string. Record 
    //.the length of the original string and add 1 to it to
    //.account for the terminating null character.
    size_t origsize = wcslen(buffer) + 1;
    size_t convertedChars = 0;

    // Allocate two bytes in the multibyte output string for every wide
    // character in the input string (including a wide character
    // null). Because a multibyte character can be one or two bytes,
    // you should allot two bytes for each character. Having extra
    // space for the new string is not an error, but having
    // insufficient space is a potential security problem.
    const size_t newsize = origsize*2;
    // The new string will contain a converted copy of the original
    // string plus the type of string appended to it.
    char *nstring = new char[newsize];

    // Put a copy of the converted string into nstring
    wcstombs_s(&convertedChars, nstring, newsize, buffer, _TRUNCATE);


    String^ strBuf = gcnew System::String(nstring) ;

    return strBuf;
}


Picture^ GetLogo()
{
    const int BUFSIZE = 1024;
    wchar_t buffer[BUFSIZE] = {0};

    //Define attributes of the OPEN FILE NAME
    OPENFILENAME ofns = {0};
    ofns.lStructSize = sizeof( ofns );
    ofns.lpstrFile = buffer;
    ofns.nMaxFile = BUFSIZE;
    ofns.lpstrTitle = importLogo.c_str();
    ofns.Flags = OFN_EXPLORER |
                 OFN_ENABLESIZING;
    GetOpenFileName( & ofns );

    wchar_t szFiles[1024], szFileTok[260];
    wchar_t szDir[1024];

    Picture^ file;

    wchar_t *p;
    lstrcpy(szFiles, buffer);
    lstrcpy(szDir, buffer);

    p = buffer;

    p += lstrlen(p) + 1;

    convertWCharToString(buffer);

    String^ strBuf = gcnew System::String(buffer) ;
    String^ strDir = gcnew System::String(szDir) ;      

    file = gcnew Picture(strBuf, strDir, false);

    return file;
}

Picture.h

#pragma once
//This is used to hold the name of the picture, the path to it, and if it is picked in the viewer
#include <string>

ref class Picture
{   
public:
    Picture(){};  //default constructor

    Picture(System::String^ newName, System::String^ newPath, bool newPicked)
    {
        strName = newName;
        strPath = newPath;
        boolPicked = newPicked;
    }

    void setName(System::String^ newName)
    {
        strName = newName;
    }

    void setPath(System::String^ newPath)
    {
        strPath = newPath;
    }


    void setPicked(bool newPicked)
    {
        boolPicked = newPicked;
    }

    System::String^ getName()
    {
        return strName;
    }
    System::String^ getPath()
    {
        return strPath;
    }
    bool getPicked()
    {
        return boolPicked;
    }   

private:
    System::String^ strName;
    System::String^ strPath;
    bool boolPicked;
};

#pragma endregion

Ниже приведен пример вызова функции getLogo

private: System::Void pictureBox1_Click(System::Object^  sender, System::EventArgs^  e) {
             Picture^ newLogo = GetLogo();
             logoPictureBox->Image = dynamic_cast<Bitmap^> (Image::FromFile(newLogo->getPath(), true));          
         }

Ниже приведена текущая ошибка:

error LNK2028: unresolved token (0A000531) "extern "C" int __stdcall GetOpenFileNameW(struct tagOFNW *)" (?GetOpenFileNameW@@$$J14YGHPAUtagOFNW@@@Z) referenced in function "class Picture ^ __clrcall GetLogo(void)" (?GetLogo@@$$FYMP$AAVPicture@@XZ) 

Если вам нужно больше кода, пожалуйста, дайте мне знать. Спасибо за ваше время.

0 ответов

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