문제

Note that i am using Windows Forms Applications with the .NET

Here is my code:

#pragma once
#include <cstdlib>
#include <Windows.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
#include <stdio.h>
#include <string>
#include <cstring>
#include <iostream>
#include <vcclr.h>
#include <hashlibpp.h>

namespace Launcher {

    using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Windows::Forms;
    using namespace System::Data;
    using namespace System::Drawing;
    using namespace System::Diagnostics;
    using namespace MySql::Data::MySqlClient;
    using namespace std;
    using namespace System::Runtime::InteropServices;




    /// <summary>
    /// Summary for Form1
    /// </summary>
    public ref class Form1 : public System::Windows::Forms::Form
    {
    public:
        Form1(void)
        {
            InitializeComponent();


            //
            //TODO: Add the constructor code here
            //
        }

    protected:
        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        ~Form1()
        {
            if (components)
            {
                delete components;
            }
        }

    //Component properties (not important)

        }
#pragma endregion

void convert(String^ total1, char    *ch){ //Converts string to const char*
    // Pin memory so GC can't move it while native function is called
   pin_ptr<const wchar_t> c1 = PtrToStringChars(total1);
   printf_s("%S\n", c1);

   // Conversion to char* :
   // Can just convert wchar_t* to char* using one of the 
   // conversion functions such as: 
   // WideCharToMultiByte()
   // wcstombs_s()
   // ... etc
   size_t convertedChars = 0;
   size_t  sizeInBytes = ((total1->Length + 1) * 2);
   errno_t err = 0;
   ch = (char *)malloc(sizeInBytes);

   err = wcstombs_s(&convertedChars, 
                    ch, sizeInBytes,
                    c1, sizeInBytes);
   if (err != 0)
      printf_s("wcstombs_s  failed!\n");

    printf_s("%s\n", ch);
}

void MarshalString ( String ^ s, string& os ) { //Another converter 
   using namespace Runtime::InteropServices;
   const char* chars = 
      (const char*)(Marshal::StringToHGlobalAnsi(s)).ToPointer();
   os = chars;
   Marshal::FreeHGlobal(IntPtr((void*)chars));
}

void MarshalString ( String ^ s, wstring& os ) { //Another converter
   using namespace Runtime::InteropServices;
   const wchar_t* chars = 
      (const wchar_t*)(Marshal::StringToHGlobalUni(s)).ToPointer();
   os = chars;
   Marshal::FreeHGlobal(IntPtr((void*)chars));
}

    private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {
             }
             //I removed some other functions from here because they are blank
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
                    //MySQL variables
                 try{
                     conDataBase->Open();
                     myReader=cmdDataBase->ExecuteReader();
                     while(myReader->Read()){
                     String^ atmp_user = textBox1->Text;
                     String^ user = (myReader->GetString(1));//Gets Usernames from database
                     String^ atmp_pass = textBox2->Text;
                     String^ pass = (myReader->GetString(2));//Gets Passwords from database
                     atmp_pass->ToLower();//Lower Case's variable
                     atmp_user->ToLower();
                     String^ total1 = gcnew String(atmp_user+atmp_pass);//Combines 2 strings

                     string totala;//std::string

                     MarshalString(total1, totala);//Copies data from (total1) to (totala)

                     hashwrapper *myWrapper = new sha1wrapper();//SHA1 hashing begins

                     string hash1 = myWrapper->getHashFromString(totala);//creates new variable(hash1) and copies data from (totala)

                     String^ finalpass;//Creates new System::String
                     MarshalString(finalpass, hash1);//Copies data from (hash1) to (finalpass)
 delete myWrapper;//Ends SHA1 hashing
                                //Login Script
                     if(atmp_user == user && finalpass == pass){
                         textBox1->Text = ("It worked!");
                     }
                     }
                 } catch(Exception^ex) {
                     MessageBox::Show(ex->Message);
                 }
         }
    //Other blank functions created
};
}

Here are the errors:

Error   4   error LNK2028: unresolved token (0A0000D5) "public: __clrcall md5wrapper::md5wrapper(void)" (??0md5wrapper@@$$FQAM@XZ) referenced in function "public: class hashwrapper * __clrcall wrapperfactory::create(enum HL_Wrappertype)" (?create@wrapperfactory@@$$FQAMPAVhashwrapper@@W4HL_Wrappertype@@@Z)  C:\Users\Jeremy\Documents\Visual Studio 2010\Projects\Launcher\Launcher\hl_wrapperfactory.obj
Error   3   error LNK2028: unresolved token (0A00009D) "public: __clrcall sha384wrapper::sha384wrapper(void)" (??0sha384wrapper@@$$FQAM@XZ) referenced in function "public: class hashwrapper * __clrcall wrapperfactory::create(enum HL_Wrappertype)" (?create@wrapperfactory@@$$FQAMPAVhashwrapper@@W4HL_Wrappertype@@@Z) C:\Users\Jeremy\Documents\Visual Studio 2010\Projects\Launcher\Launcher\hl_wrapperfactory.obj
Error   2   error LNK2028: unresolved token (0A000094) "public: __clrcall sha512wrapper::sha512wrapper(void)" (??0sha512wrapper@@$$FQAM@XZ) referenced in function "public: class hashwrapper * __clrcall wrapperfactory::create(enum HL_Wrappertype)" (?create@wrapperfactory@@$$FQAMPAVhashwrapper@@W4HL_Wrappertype@@@Z) C:\Users\Jeremy\Documents\Visual Studio 2010\Projects\Launcher\Launcher\hl_wrapperfactory.obj
Error   1   error LNK2028: unresolved token (0A00005B) "public: __clrcall sha256wrapper::sha256wrapper(void)" (??0sha256wrapper@@$$FQAM@XZ) referenced in function "public: class hashwrapper * __clrcall wrapperfactory::create(enum HL_Wrappertype)" (?create@wrapperfactory@@$$FQAMPAVhashwrapper@@W4HL_Wrappertype@@@Z) C:\Users\Jeremy\Documents\Visual Studio 2010\Projects\Launcher\Launcher\hl_wrapperfactory.obj
Error   5   error LNK2019: unresolved external symbol "public: __clrcall sha512wrapper::sha512wrapper(void)" (??0sha512wrapper@@$$FQAM@XZ) referenced in function "public: class hashwrapper * __clrcall wrapperfactory::create(enum HL_Wrappertype)" (?create@wrapperfactory@@$$FQAMPAVhashwrapper@@W4HL_Wrappertype@@@Z)  C:\Users\Jeremy\Documents\Visual Studio 2010\Projects\Launcher\Launcher\hl_wrapperfactory.obj
Error   6   error LNK2019: unresolved external symbol "public: __clrcall sha384wrapper::sha384wrapper(void)" (??0sha384wrapper@@$$FQAM@XZ) referenced in function "public: class hashwrapper * __clrcall wrapperfactory::create(enum HL_Wrappertype)" (?create@wrapperfactory@@$$FQAMPAVhashwrapper@@W4HL_Wrappertype@@@Z)  C:\Users\Jeremy\Documents\Visual Studio 2010\Projects\Launcher\Launcher\hl_wrapperfactory.obj
Error   7   error LNK2019: unresolved external symbol "public: __clrcall sha256wrapper::sha256wrapper(void)" (??0sha256wrapper@@$$FQAM@XZ) referenced in function "public: class hashwrapper * __clrcall wrapperfactory::create(enum HL_Wrappertype)" (?create@wrapperfactory@@$$FQAMPAVhashwrapper@@W4HL_Wrappertype@@@Z)  C:\Users\Jeremy\Documents\Visual Studio 2010\Projects\Launcher\Launcher\hl_wrapperfactory.obj
Error   8   error LNK2019: unresolved external symbol "public: __clrcall md5wrapper::md5wrapper(void)" (??0md5wrapper@@$$FQAM@XZ) referenced in function "public: class hashwrapper * __clrcall wrapperfactory::create(enum HL_Wrappertype)" (?create@wrapperfactory@@$$FQAMPAVhashwrapper@@W4HL_Wrappertype@@@Z)   C:\Users\Jeremy\Documents\Visual Studio 2010\Projects\Launcher\Launcher\hl_wrapperfactory.obj
Error   9   error LNK1120: 8 unresolved externals   C:\Users\Jeremy\Documents\Visual Studio 2010\Projects\Launcher\Debug\Launcher.exe   1

I don't understand these so i hope you guys can. Btw i am using the hashlib++ library in this project for the SHA1 hashing. I am assuming that's why there are so many references to it.

도움이 되었습니까?

해결책

You need to link againts the library itself. In visual studio, go to project preferences, linker options, and choose the actual library you're using. Here you can find an example with screenshoots on how it can be done.

다른 팁

This is a weird error I've run into. For some reason VC++ treats the methods as having __clrcall calling convention, even though they belong to unmanaged classes. I'm not sure what triggers it, it doesn't happen most of the time.

If all else fails, try explicitly marking methods of unmanaged classes (including constructors and destructors) with the __thiscall calling convention (which is the default for unmanaged methods):

class md5wrapper
{
public:
    __thiscall md5wrapper();
    __thiscall ~md5wrapper();

    void __thiscall SomeMethod();

    ...
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top