【问题标题】:C++ can't identify command in DLLC++ 无法识别 DLL 中的命令
【发布时间】:2016-01-18 03:12:02
【问题描述】:

我正在尝试使此 DLL 可运行,但即使使用现成的代码也无法使其工作。

我在 c++ 中从 Visual Studio 创建了一个简单的 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 );

还有主项目.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++ 一无所知,这些是我的第一步,但我可以理解很多而且很容易。

谁能告诉我我应该在这两个文件中更改什么以使其正常工作?

【问题讨论】:

  • 阅读__declspec(dllimport)__declspec(dllexport)
  • 我不认为它与导入或导出有关,这是我阅读和制作的逐步配置,但它不起作用。它必须与 std 做不认识的命令的声明我将在几行中编写代码以防万一
  • 我不是 C++ dll 的 epxert,但您的 command1 和 command2 函数不应该在使用前声明吗?所以把这两个函数移到 OnEntry() 上面再试一次。
  • 我也进行了更改,但给我带来了一些奇怪的错误...如果我在 typedef std::wstring 的 .h 文件中没有错,则声明 2 个命令 wstring

标签: c++ visual-studio dll mdm zinc


【解决方案1】:

函数Command1Command2 没有在带有typedef 语句的头文件中声明。该语句定义了一个类型ZINC_COMMAND_CALLBACK,它是一个指向一个函数的指针,该函数的签名与函数Command1Command2 的签名匹配。这意味着您可以获取其中一个函数(或具有相同签名的任何其他函数)的地址并将其分配给此指针:

ZINC_COMMAND_CALLBACK comm1 = &Command1;

您的代码的问题是您在声明它们之前就使用了这些函数。要么将 Command1Command2 的完整定义放在函数 OnEntry 之前,要么将定义留在原处并在 OnEntry 之前添加以下声明:

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

我已经测试了这段代码,它修复了与Command1Command2 相关的错误。出现的新错误是由于未定义函数RegisterModuleRegisterCommand 而导致的两个链接器错误,但我猜您省略了这些定义,因为它们与问题无关。

【讨论】:

  • 我会试一试,让你知道,正如我所说,我按照指南创建此代码,我不知道 C++ 中的漏洞是如何工作的,无论是这门语言的新手,但我明白使用其他语言的原因。提前谢谢您
【解决方案2】:

它有效,但只有在他们面前有标准

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() 函数之前有效并且是的

感谢大家的快速回复

【讨论】:

  • 命名空间限定(在类型前添加std::)只有在您从“Main Project.cpp”中删除声明using namespace std;时才需要。
  • 是的,确实,我已经删除了它,没有提到它,因为我真的不知道他们所有人都在做什么,我在多次尝试实现它之后管理。
猜你喜欢
  • 2015-06-29
  • 1970-01-01
  • 2014-06-15
  • 2020-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多