返回struct的Dllimport函数

返回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

我有一个第三方.dll,我必须在C++/CLI代码中使用它的函数。我正在尝试dllimport,但收到一个错误:

错误C33385:“msp_FormatMessage”:具有Dllimport自定义属性的函数无法返回类的实例

在C#中,这个问题可以通过使用StructLayout来解决,但我在C++/CLI中找不到任何方法来解决这个问题

功能定义:

[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