返回struct的Dllimport函数
我有一个第三方.dll,我必须在C++/CLI代码中使用它的函数。我正在尝试dllimport,但收到一个错误: 错误C33385:“msp_FormatMessage”:具有Dllimport自定义属性的函数无法返回类的实例 在C#中,这个问题可以通过使用StructLayout来解决,但我在C++/CLI中找不到任何方法来解决这个问题 功能定义:返回struct的Dllimport函数,struct,c++-cli,dllimport,Struct,C++ Cli,Dllimport,我有一个第三方.dll,我必须在C++/CLI代码中使用它的函数。我正在尝试dllimport,但收到一个错误: 错误C33385:“msp_FormatMessage”:具有Dllimport自定义属性的函数无法返回类的实例 在C#中,这个问题可以通过使用StructLayout来解决,但我在C++/CLI中找不到任何方法来解决这个问题 功能定义: [DllImport("drtl3.dll", EntryPoint = "msp_FormatMessage")] extern "C++" m
[DllImport("drtl3.dll", EntryPoint = "msp_FormatMessage")]
extern "C++" msp_Message msp_FormatMessage(msp_Message* buffer, char type, char RT, char SA, char RTR_MC, unsigned short SAR_MCD, char dataWordCount, unsigned short data[], unsigned int bccw);
typedef struct {
msp_WORD type;
msp_WORD dataWordCount;
msp_WORD bccw;
msp_WORD CmdWord1;
msp_WORD CmdWord2;
msp_WORD Data[32];
msp_WORD StatusWord1;
msp_WORD StatusWord2;
msp_WORD loopback;
msp_WORD bsw;
msp_WORD timetag;
msp_BYTE present;
msp_BYTE transmit;
msp_BYTE check;
msp_BYTE role;
} msp_Message;
结构定义:
[DllImport("drtl3.dll", EntryPoint = "msp_FormatMessage")]
extern "C++" msp_Message msp_FormatMessage(msp_Message* buffer, char type, char RT, char SA, char RTR_MC, unsigned short SAR_MCD, char dataWordCount, unsigned short data[], unsigned int bccw);
typedef struct {
msp_WORD type;
msp_WORD dataWordCount;
msp_WORD bccw;
msp_WORD CmdWord1;
msp_WORD CmdWord2;
msp_WORD Data[32];
msp_WORD StatusWord1;
msp_WORD StatusWord2;
msp_WORD loopback;
msp_WORD bsw;
msp_WORD timetag;
msp_BYTE present;
msp_BYTE transmit;
msp_BYTE check;
msp_BYTE role;
} msp_Message;
我不明白这个问题。。显示代码。显示错误消息。。我刚刚用结构测试了dllimport 您应该注意,通常首选通过dlopen和dlsym或loadlibrary和getprocaddress动态加载。为什么?因为你不能“总是”去运动。示例:带有VS2012的dllexport并不总是与g++中的dllimport一起工作。对于符号的导出方式没有定义的标准 使用Mingw-g++4.8.1 动态链接库:
#包括
#包括
类型定义结构{
无符号短meh;
无符号短气泡;
char-we[50];
}傅;
extern_uudeclspec(dllexport)foo some_func()
{
福福;
f、 meh=10;
f、 bleh=20;
strcpy(f.we,hello world\0);
返回f;
}
外部“C”uu declspec(dllexport)BOOL APIENT DllMain(HINSTANCE hinstDLL、DWORD FDFREASON、LPVOID lpvReserved)
{
开关(FDSON)
{
案例DLL\u进程\u附加:
打破
案例DLL\u进程\u分离:
打破
}
返回TRUE;
}
进口商:
#include <iostream>
typedef struct {
unsigned short meh;
unsigned short bleh;
char we[50];
} foo;
extern __declspec(dllimport) foo some_func();
int main()
{
foo f = some_func();
std::cout<<f.meh<<" "<<f.bleh<<" "<<f.we<<"\n";
return 0;
}
#包括
类型定义结构{
无符号短meh;
无符号短气泡;
char-we[50];
}傅;
extern_udeclspec(dllimport)foo some_func();
int main()
{
foo f=some_func();
std::cout您需要将返回的结构声明为非托管结构,这样可以正常工作:
#using <mscorlib.dll>
using namespace System::Runtime::InteropServices;
#pragma managed(push, off)
using msp_WORD = short;
using msp_BYTE = char;
typedef struct {
msp_WORD type;
msp_WORD dataWordCount;
msp_WORD bccw;
msp_WORD CmdWord1;
msp_WORD CmdWord2;
msp_WORD Data[32];
msp_WORD StatusWord1;
msp_WORD StatusWord2;
msp_WORD loopback;
msp_WORD bsw;
msp_WORD timetag;
msp_BYTE present;
msp_BYTE transmit;
msp_BYTE check;
msp_BYTE role;
} msp_Message;
#pragma managed(pop)
[DllImport("drtl3.dll", EntryPoint = "msp_FormatMessage")]
extern "C++" msp_Message msp_FormatMessage(msp_Message* buffer, char type, char RT, char SA, char RTR_MC, unsigned short SAR_MCD, char dataWordCount, unsigned short data [], unsigned int bccw);
#使用
使用名称空间System::Runtime::InteropServices;
#pragma管理(推、关)
使用msp_WORD=short;
使用msp_BYTE=char;
类型定义结构{
msp_字型;
msp_字数据字计数;
msp_单词bccw;
msp_WORD CmdWord1;
msp_WORD CmdWord2;
msp_字数据[32];
msp_WORD StatusWord1;
msp_WORD StatusWord2;
msp_字环回;
msp_单词bsw;
msp_字时间标签;
存在msp_字节;
msp_字节传输;
msp_字节检查;
msp_字节角色;
}msp_消息;
#布拉格语管理(pop)
[DllImport(“drtl3.dll”,EntryPoint=“msp_FormatMessage”)]
外部“C++”msp_消息msp_FormatMessage(msp_消息*缓冲区、字符类型、字符RT、字符SA、字符RTR_MC、无符号短SAR_MCD、字符数据字计数、无符号短数据[]、无符号整数bccw);
<>或者如果这不起作用,你可以一直用C++方式来处理C++ +CLI,有些是
#include "windows.h"
#pragma managed(push, off)
using msp_WORD = short;
using msp_BYTE = char;
typedef struct {
msp_WORD type;
msp_WORD dataWordCount;
msp_WORD bccw;
msp_WORD CmdWord1;
msp_WORD CmdWord2;
msp_WORD Data[32];
msp_WORD StatusWord1;
msp_WORD StatusWord2;
msp_WORD loopback;
msp_WORD bsw;
msp_WORD timetag;
msp_BYTE present;
msp_BYTE transmit;
msp_BYTE check;
msp_BYTE role;
} msp_Message;
#pragma managed(pop)
typedef msp_Message msp_FormatMessage_t(msp_Message* buffer, char type, char RT, char SA, char RTR_MC, unsigned short SAR_MCD, char dataWordCount, unsigned short data [], unsigned int bccw);
msp_FormatMessage_t *msp_FormatMessage;
HINSTANCE hDLL;
int main(array<System::String ^> ^args)
{
hDLL= LoadLibraryA("drtl3.dll");
msp_FormatMessage = (msp_FormatMessage_t *)GetProcAddress(hDLL,"?msp_FormatMessage@@YA?AUmsp_Message_t@@PAU1@DDDDGDQAGI@Z");
msp_Message test = msp_FormatMessage(nullptr, 1, 2, 3, 4, 5, 6, nullptr, 7);
Console::Write("type ");
Console::WriteLine(test.type);
Console::Write("check");
Console::WriteLine(test.check);
// std::cout << "type" << test.type << std::endl;
//std::cout << "check" << test.check << std::endl;
Console::WriteLine(L"Hello World");
return 0;
}
#包括“windows.h”
#pragma管理(推、关)
使用msp_WORD=short;
使用msp_BYTE=char;
类型定义结构{
msp_字型;
msp_字数据字计数;
msp_单词bccw;
msp_WORD CmdWord1;
msp_WORD CmdWord2;
msp_字数据[32];
msp_WORD StatusWord1;
msp_WORD StatusWord2;
msp_字环回;
msp_单词bsw;
msp_字时间标签;
存在msp_字节;
msp_字节传输;
msp_字节检查;
msp_字节角色;
}msp_消息;
#布拉格语管理(pop)
类型定义msp_消息msp_格式消息(msp_消息*缓冲区,字符类型,字符RT,字符SA,字符RTR_MC,无符号短SAR_MCD,字符数据字计数,无符号短数据[],无符号整数bccw);
msp_FormatMessage_t*msp_FormatMessage;
HINSTANCE hDLL;
int main(数组^args)
{
hDLL=LoadLibraryA(“drtl3.dll”);
msp_FormatMessage=(msp_FormatMessage_t*)GetProcAddress(hDLL),“?msp_FormatMessage@@YA?AUmsp_Message”@@PAU1@DDDDGDQAGI@Z”);
msp_消息测试=msp_FormatMessage(nullptr,1,2,3,4,5,6,nullptr,7);
控制台::写入(“类型”);
控制台::WriteLine(test.type);
控制台::写(“检查”);
控制台::写线(测试检查);
//std::难道你不应该这样标记C++/CLI
问题吗?许多环顾C++
标记的人甚至都不知道它的存在,所以你在提问时应该明确说明它的存在。你确定结果是直接返回的,而不是作为指针返回的吗?确实是这样:msp_Message*msp_FormatMessage(msp_Message*buffer,msp_BYTE type,msp_BYTE RT,msp_BYTE SA,msp_BYTE RTR_MC,msp_WORD SAR_MCD,msp_BYTE dataWordCount,msp_WORD*data,msp_DWORD bccw);
是的,提问者没有充分解释他实际上使用的是C++/CLI但是,我想你的问题仍然是相关的,如果他想让它在纯C++中工作,是的,你是对的,我使用C++ + CLI。我已经编辑了这个问题,让它变得清晰。@ MaIAc98066,我添加了不太漂亮的C++方式(也适用于CLI)。.我不是CLI专家,因此在DllImport