C++ 无法识别 DLL 中的命令

标签 c++ visual-studio dll mdm zinc

我正在尝试使此 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++ 一无所知,这些是我的第一步,但我可以很容易地理解。

任何人都可以告诉我我应该将这些更改为两个文件以使其工作吗?

最佳答案

函数 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++ 无法识别 DLL 中的命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34846740/

相关文章:

c# - 将 DLL 构建到单独的文件夹

c++ - 访问使用 def 文件导出的静态变量时崩溃

C++ 初始化非常大的常量数组,最佳实践

c++ - 引用函数 "int &foo();"是如何工作的?

c++ - 检查元组类型是否是彼此的子集

c++ - 如何连接两个 C++ 映射

c++ - VS 2017 : fail to create C++ projects

c# - Visual Studio 中的 TestContext - 它有什么作用?

android - 是否可以在不使用 JNI 的情况下在 Android 应用程序开发中实现 DLL 概念?

c# - HRESULT 异常 : 0x80040111 (CLASS_E_CLASSNOTAVAILABLE)