C++无法识别 DLL 中的命令
C++ can't identify command in DLL
我正在尝试使这个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++ 一无所知,这些是我的第一步,但我可以理解很多而且很容易。
谁能告诉我我应该将这些文件更改为两个文件以使其工作?
函数 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() 函数之前
是的谢谢大家的快速回复
相关文章:
- 从命令行c++发送文本文件名
- 挂起和取消挂起一个文件DLL
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 导入库可以跨dll版本工作吗
- 从C++dll访问C#中的一行主要参数
- 链接到自行创建的dll失败
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 如何处理错误"E1696命令行错误:无法在Visual Studio 2017中打开元数据文件"mscorlib.dll"?
- C 向CMD.EXE监视命令注入DLL
- 命令和UPDATE_COMMAND_UI处理程序未在 MFC dll 中调用
- C++无法识别 DLL 中的命令
- 正在尝试在azure中加载未执行命令的c++dll
- 找不到“协议缓冲区生成”命令libprotobuf.dll.a
- 链接DLL时命令行错误
- Visual Studio.如何构建DLL(在命令行中),通过附加到进程来调试工作
- 如何使用Visual c++命令提示符构建DLL
- 当从c#调用外部dll时,从命令行参数中删除空格