Windows C - 使用 MIDL 协议通过引用动态分配的 unsigned char 内存传递指针

Posted

技术标签:

【中文标题】Windows C - 使用 MIDL 协议通过引用动态分配的 unsigned char 内存传递指针【英文标题】:Windows C - Pass pointer by reference to dynamic allocated memory of unsigned char with MIDL Protocol 【发布时间】:2014-05-31 20:02:18 【问题描述】:

我正在使用 MIDL 协议 (RPC),并且我试图通过引用分配的 unsigned char 内存来传递指针。但只有数组的第一个属性填充了正确的值。

中间代码:

 // File FPGA_RPC_MIDL.idl
 [
    // A unique identifier that distinguishes this interface from other interfaces.
uuid(00000001-EAF3-4A7A-A0F2-BCE4C30DA77E),

// This is version 1.0 of this interface.
version(1.0)
 ]

interface FPGA_RPC_MIDL // The interface is named FPGA_RPC_MIDL


    int get_Message([ref, out]  unsigned char* message_out);


服务器代码:

int get_Message(
/* [ref][out] */ unsigned char *message_out)

   message_out[0] = 0x25;
   message_out[1] = 0x26;
   message_out[2] = 0x27;
   return 0;'

客户端代码:

int main

      message_out = (unsigned char *)malloc(sizeof(unsigned char)*3);
      get_Message(message_out);
      printf("%x, %x, %x",message_out[0],message_out[1],message_out[2])

输出:

25,0,0

如何通过引用传递所有数组?

【问题讨论】:

看看这个链接 - msdn.microsoft.com/en-us/library/windows/desktop/… 你必须提供一个 size 属性。否则,存根怎么知道返回了多少数据。 【参考方案1】:

[ref, out] 是在这种情况下使用的错误属性集。您告诉 MIDL get_Message() 通过引用返回单个字符作为输出值,这就是您的数据被编组的方式,但这不是您的代码想要的。它想填充一个多字符数组,所以你必须相应地编组它。

试试这个:

int get_Message([in, out, size_is(3)] unsigned char message_out[]);

或者简单地说:

int get_Message(unsigned char message_out[3]);

更多详情请参考 MSDN:

MIDL Arrays

【讨论】:

以上是关于Windows C - 使用 MIDL 协议通过引用动态分配的 unsigned char 内存传递指针的主要内容,如果未能解决你的问题,请参考以下文章

MIDL 编译器错误:MIDL

错误 MSB6006:“midl.exe”退出,代码为 2026

midl.exe 6 和 midl.exe 7 的不同输出

获取 MIDL 2003 重新定义错误

错误 MIDL2025:语法错误:需要一个接口

MIDL相关