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

时间:2016-01-18 03:12:02

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

我正在努力使这个DLL能够运行,但即使从现成的代码中也无法使它工作。

我在c ++(win32项目)中从visual studio创建一个简单的DLL 我使用了这两个文件。

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 ++没有任何了解,这些是我的第一步,但我能理解并且很容易。

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

2 个答案:

答案 0 :(得分:0)

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

ZINC_COMMAND_CALLBACK comm1 = &Command1;

您的代码的问题在于您在声明它们之前使用这些函数。在函数Command1之前放置Command2OnEntry的完整定义,或者将定义保留在它们所在的位置,并在OnEntry之前添加以下声明:

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

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

答案 1 :(得分:0)

它只能与他们面前的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()函数

之前工作正常

谢谢大家的快速回复