0

私は.NETでWindowsフォームアプリケーションを使用していることに注意してください

これが私のコードです:

#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
};
}

エラーは次のとおりです。

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

私はこれらを理解していないので、皆さんができることを願っています。ところで、このプロジェクトでは SHA1 ハッシュに hashlib++ ライブラリを使用しています。参考文献が多いのはそのためだと思います。

4

2 に答える 2

0

ライブラリ自体にリンクする必要があります。Visual Studio で、プロジェクトの設定、リンカー オプションに移動し、使用している実際のライブラリを選択します。 ここでは、それを行う方法のスクリーンショット付きの例を見つけることができます。

于 2013-03-29T03:34:15.543 に答える
0

これは私が遭遇した奇妙なエラーです。何らかの理由で、VC++ は、メソッドがアンマネージ クラスに属していても、メソッドを __clrcall 呼び出し規約を持つものとして扱います。何が原因かはわかりませんが、ほとんどの場合は発生しません。

他のすべてが失敗した場合は、__thiscall 呼び出し規則 (アンマネージ メソッドの既定) を使用して、アンマネージ クラス (コンストラクターとデストラクタを含む) のメソッドを明示的にマークしてみてください。

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

    void __thiscall SomeMethod();

    ...
于 2013-03-29T05:10:30.177 に答える