【问题标题】:C++ access function from C DLL/libC DLL/lib 中的 C++ 访问函数
【发布时间】:2013-04-15 10:35:08
【问题描述】:

我正在拼命地尝试访问随某些硬件提供的 DLL。我有 DLL、LIB 文件和 DLL 的标头。

我第一次尝试使用 C#,但由于传递的数据结构很大而失败了。我调用了函数,但修改的结构中的值不正确。

然后我想用 C++ 编写一个包装类并将其用作 C# 的库。但在这里我可以再次调用该函数,但如果我测试了一个传递的有符号长整数,它是“1072955392l”而不是“-1l”。

然后我将 cpp 文件重命名为“.c”并再次编译。现在我得到了正确的值。

从 C 到 C++ 的数据类型有什么不同吗?

提供的包含文件中的 LIb 函数声明如下:

_declspec (dllimport) long ResetControl(Registers* regs);

我使用VS2013编译:

cl test.cpp /link test.lib
cl test.c /link test.lib

cpp 文件和 c 文件是相同的,除非我需要为 cpp 包含 #include 并将 dll 包含头包装在

extern "C"
{
    #include "test.h"
}

test.c 文件如下所示:

//#include <windows.h>
#include <stdlib.h> 
#include <malloc.h>

#include <stdio.h>
#include <math.h>

#include "test.h"

int main (int argc, char **argv)
{

  Registers Regs;
  Reset (&Regs); 
  printf ("Value: %dl\n\r", Regs.Product);
  return 0;
}

C++ 文件:

#include <windows.h>
#include <stdlib.h> 
#include <malloc.h>
#include <stdio.h>
#include <math.h>

extern "C"
{
    #include "test.h"
}

int main (int argc, char **argv)
{
  Registers Regs;
  Reset (&Regs);
  printf ("Value: %dl\n\r", Regs.Product);
  return 0;
}

都可以编译,但是打印Regs.Products的结果不一样:

C: -1l
C++: 1072955392l

我在这里做错了什么?

【问题讨论】:

  • 什么都看不到,“test.h”文件长什么样子?
  • 您可以检查 C 和 C++ 版本的程序集输出 (cl /Fa),然后进行比较。
  • 另外,如果您使用long 整数,请确保您至少应该在l 之前使用%ld 格式,而不仅仅是%d
  • 检查汇编输出我发现使用 C 或 C++ 编译时结构的大小不同。 Lib 的 BOOL 大小似乎是 4 字节类型。现在我让它与 C++ 一起工作。利用这些知识,我再次启动了 C# 项目并更正了结构的大小。但是还是没有看这里:(

标签: c++ c dll static-libraries


【解决方案1】:

我在某处看到在编译 DLL 的客户端时存在对齐到 4 个字节的问题。

但是看看那些页面:

亚历山大

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    • 2014-03-19
    • 1970-01-01
    • 2014-04-07
    • 1970-01-01
    相关资源
    最近更新 更多