C++ не может определить команду в DLL

Я пытаюсь сделать эту DLL работоспособной, но не могу заставить ее работать даже из готового кода.

Я создаю простую DLL из Visual Studio в C++ (проект Win32), и у меня есть эти 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 );

И Основной 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 ответа

Решение

Функции Command1 а также Command2 не объявлены в заголовочном файле с этим typedef заявление. Это утверждение определяет тип ZINC_COMMAND_CALLBACK, который является указателем на функцию, подпись которой совпадает с сигнатурой функций Command1 а также Command2, Это означает, что вы можете взять адрес одной из этих функций (или любой другой функции с той же сигнатурой) и назначить ее этому указателю:

ZINC_COMMAND_CALLBACK comm1 = &Command1;

Проблема с вашим кодом в том, что вы используете эти функции до того, как объявите их. Либо поставить целые определения Command1 а также Command2 перед функцией OnEntryили оставьте определения там, где они есть, и добавьте следующие объявления перед OnEntry:

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

Я проверил этот код, и он исправляет ошибки, связанные с Command1 а также Command2, Новые ошибки, которые появляются, являются двумя ошибками компоновщика, вызванными фактом, что функции RegisterModule а также RegisterCommand не определены, но я предполагаю, что вы пропустили эти определения, потому что они не имеют отношения к вопросу.

Это работало, но только со стандартным

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:: infront, и он работает, и да, до функции onEntry()

Спасибо всем за быстрые ответы

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