1

この DLL を機能可能にしようとしていますが、準備完了のコードからでも機能させることができません。

C ++(win32プロジェクト)でVisual Studioから単純なDLLを作成し、使用するこの2つのファイルを持っています。

headerZincSDK.h

// headerZincSDK.h
#pragma once

#include <string>
#include <vector>

#if defined( WIN32 )
#include <tchar.h>
#define mdmT( x )   _T( x )
#else
#define mdmT( x )   L ## x
#endif

extern void OnEntry();

extern bool RegisterModule( const std::wstring& strName );

typedef struct
{
    int formId;
} 
ZincCallInfo_t;

typedef std::wstring ( *ZINC_COMMAND_CALLBACK )( const ZincCallInfo_t& info, const std::vector< std::wstring >& );

extern bool RegisterCommand( const std::wstring& strModuleName,
                     const std::wstring& strCommandName,
                     ZINC_COMMAND_CALLBACK callback );

// Helper commands for returning values
std::wstring AsString( const std::wstring& str );
std::wstring AsInteger( int value );
std::wstring AsBoolean( bool value );

そして Main Project.cpp

// Project1.cpp
#include "stdafx.h"

#include "headerZincSDK.h"

using namespace std;

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    return TRUE;
}

void OnEntry()
 {
     wstring moduleName = mdmT( "TestExt" );

     RegisterModule( moduleName );

     RegisterCommand( moduleName, mdmT( "random" ), Command1 );

     RegisterCommand( moduleName, mdmT( "reverse" ), Command2 );
 } 

wstring Command1 (const ZincCallInfo_t& info, const vector< wstring >& vParams )
 {
     //My Code
 }

wstring Command2 (const ZincCallInfo_t& info, const vector< wstring >& vParams )
 {
     //My Code
 }

問題は、Command1 と Command2 が未定義であると表示され、ソリューションがビルドされないことです。

私はC ++に関する知識がまったくなく、これが私の最初のステップですが、多くのことを簡単に理解できます。

これらを機能させるには、これらの2つのファイルで何を変更すればよいか教えてもらえますか?

4

2 に答える 2

0

関数Command1およびCommand2は、そのステートメントを使用してヘッダー ファイルで宣言されていませんtypedef。このステートメントは、関数およびZINC_COMMAND_CALLBACKのシグネチャと一致するシグネチャを持つ関数へのポインタであるtype を定義します。これは、これらの関数の 1 つ (または同じ署名を持つ他の関数) のアドレスを取得して、このポインターに割り当てることができることを意味します。Command1Command2

ZINC_COMMAND_CALLBACK comm1 = &Command1;

コードの問題は、宣言する前にこれらの関数を使用していることです。functionの定義全体をCommand1およびCommand2function の前に置くか、定義OnEntryをそのままにして の前に次の宣言を追加しますOnEntry

wstring Command1(const ZincCallInfo_t& info, const vector< wstring >& vParams);
wstring Command2(const ZincCallInfo_t& info, const vector< wstring >& vParams);

Command1このコードをテストしたところ、 およびに関連するエラーが修正されましたCommand2RegisterModule表示される新しいエラーは、関数とが定義されていないという事実に起因する 2 つのリンカー エラーRegisterCommandですが、これらの定義は質問に関連していないため、これらの定義を省略したと推測されます。

于 2016-01-18T08:50:15.927 に答える
0

それは機能しましたが、それらの前にstdがある場合のみ

std::wstring Command1 (const ZincCallInfo_t& info, const vector< std::wstring >& vParams )
 {
     //My Code
 }

std::wstring Command2 (const ZincCallInfo_t& info, const vector< std::wstring >& vParams )
 {
     //My Code
 }

そうでなければ、理由がわからないエラーでいっぱいでした。しかし、私はなんとかこの std:: を前に入力し、それは機能し、 onEntry() 関数の前にはい

迅速な対応をありがとうございました

于 2016-01-18T11:12:26.910 に答える