C++ 无法识别 DLL 中的命令
C++ can't identify command in DLL
我正在尝试使此 DLL 可用,但即使使用现成的代码也无法使其运行。
我从 visual studio 在 c++ 中创建了一个简单的 DLL(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 未定义
我 none 对 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
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() 函数之前
感谢大家的快速回复
我正在尝试使此 DLL 可用,但即使使用现成的代码也无法使其运行。
我从 visual studio 在 c++ 中创建了一个简单的 DLL(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 未定义
我 none 对 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
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() 函数之前
感谢大家的快速回复