【问题标题】:How to call program written in c++ call my DLL written in c如何调用用c++编写的程序调用我用c编写的DLL
【发布时间】:2014-04-16 11:27:23
【问题描述】:

我用 C 语言开发了一个 dll,并用这种方法调用了我的 C++ 程序

#include <cstdlib>
#include <iostream>
#include <windows.h>

#ifdef __cplusplus
extern "C" {
#endif
#include "mydll.h"
#ifdef __cplusplus
}
#endif
using namespace std;

int main(int argc, char *argv[])
{
    struct myown_struct *ss = NULL;
    int i = 0,j = 0, result = 0;
    struct myown_struct2 *s = NULL;
    myfunction("string1", "string2", "string3", 1500);
    system("PAUSE");
    return EXIT_SUCCESS;
}

mydll.h:

#ifndef _DLL_H_
#define _DLL_H_

#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define DLLIMPORT __declspec (dllimport)
#endif /* Not BUILDING_DLL */

struct myown_struct {
  int fd;
  char buf[32];
  unsigned int len;
} __attribute__((packed));

DLLIMPORT void myfunction(char *s1, char* s2, char *s3, int n);

#endif /* _DLL_H_ */

我收到此错误:

C:\Users\user01\Desktop\test\main.cpp 在函数int main(int, char**) C:\Users\user01\Desktop\test\main.cppmyfunction' undeclared (first use this function)

我该如何解决?

【问题讨论】:

  • 向我们展示 mydll.h?似乎您的用法与标头中的签名不匹配,或者未在标头中声明。
  • @crashmstr:你可以看到我的更新

标签: c++ c visual-studio-2012 dll dev-c++


【解决方案1】:

由于您使用的是 VC++,因此您可以使用现有的 API 来实现相同的目的

typedef void (*myfunction)(char *buf1, char *buf2,char *buf3,char *buf4);
HMODULE hModule = LoadLibrary(_T("mydll.dll"));
if(hModule!=NULL)
    myfunction GetMyFunction = (myfunction) GetProcAddress(hModule,"myfunction");

现在使用GetMyFunction()

希望这会有所帮助

【讨论】:

  • 虽然这可行,但我认为没有任何理由为此使用 DLL 的运行时加载。
  • 嘿@crashmstr ..你能告诉我在运行时不需要加载dll的另一种方式...... :-)
  • @HadeS 没错。这是一种更清洁、更简单的链接方式。我认为你建议使用更混乱和更糟糕的链接方法而不实际解决真正的问题是很糟糕的。最好用正确的方式解决问题。
  • 投反对票并不意味着您的答案是错误的。与否决三角形相关的提示说“这个答案没用”。在我看来,投反对票的人是正确的。这个答案没有用。这充其量是误导。
  • @ChristopherOicles 即使是(当然不是),也应该在答案中说明。否则,答案给人的印象是运行时链接是问题的解决方案。这不是因为问题是编译问题而不是链接问题。我相信你会同意的。
【解决方案2】:

您的头文件mydll.h 似乎缺少myfunction 的声明。更正该遗漏,您的代码将编译。

除此之外,您还需要确保:

  • 编译 DLL 时创建的 .lib 导入库会在链接 C++ 程序时传递给链接器。
  • 当您尝试运行您的程序时可以找到该 DLL。最好将 DLL 放在与可执行文件相同的目录中。

我还要评论说,我希望在头文件中看到extern "C",而不是强制头文件的每个用户都写extern "C"。头文件真的应该是独立的。

【讨论】:

  • 我不会错过mydll.hmyfunction的声明
  • 如果这是真的,那么你的编译器坏了。也许你应该你的头文件。
  • 我用 dev-c++ 和 Visual Studio 2012 编译,我遇到了同样的问题
  • 代码在这里编译。当我添加缺少的 windows.h 包含时。你有没有定义_DLL_H_
  • 好了,代码编译到这里。显然还有别的东西在起作用。问问自己为什么编译器看不到myfunction 的声明。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多