Я пытаюсь сделать эту 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 ++, и это мои первые шаги, но я могу понять многое и легко.
Может кто-нибудь сказать мне, что я должен изменить в этих двух файлах, чтобы это работало?
функции 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 ()
Спасибо всем за быстрые ответы