0

我正在尝试用 C++ 编写和测试一个 dll 文件,只要我想要文件系统级别的访问权限,我就可以调用它。尝试在 C++ 中访问此 dll 中的方法时,我目前非常头疼。奇怪的是,我能够轻松地在单独的 C# 程序中调用代码,但我想了解 dll 交互在 C++ 中是如何工作的。

这是我的虚拟可执行文件的 .cpp,它应该只调用我的“newMain”测试方法。

// dummy.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <string>
//#pragma comment(lib,"visa32.lib")
#pragma message("automatic link to adsInterface.dll")
#pragma message(lib, "adsInterface.lib"

extern "C" int __stdcall newMain();

int _tmain(int argc, _TCHAR* argv[])
{
 newMain();
 std::string i;
 std::cin >> i
 return 0;
}

问题是,当我运行它时,我得到了这个错误:

error LNK2019: unresolved external symbol _newMain@0 referenced in function _wmain
error LNK1120: 1 unresolved externals

这是 adsInterface 的 .h:

// adsInterface.h

#ifndef ADSINTERFACE_H
#define ADSINTERFACE_H

/* //save this for later i have no clue how this really works.
#ifdef ADSAPI_EXPORTS
#define ADSAPI __declspec(dllexport)
#else
#define ADSAPI __declspec(dllexport)
#endif
*/

namespace ADSInterface
{
  //test method. should print to console.
  __declspec(dllexport) int __stdcall newMain();

  void hello();
}
#endif

这是我的 adsInterface 的 .cpp:

// adsInterface.cpp : Defines the exported functions for the DLL application.
//

#include "stdafx.h"
#include "adsInterface.h"
#include <iostream>

namespace ADSInterface
{
  /* this is where the actual internal class and other methods will go */

  void hello()
  {
    std::cout << "hello from the DLL!" << std::endl;
  }


  __declspec(dllexport) int __stdcall newMain()
  {
    hello();
    return 0;
  }
}

我还将包含我在编译 dll 时使用的 .def 文件:

; adsInterface.def - defines exports for adsInterface.dll

LIBRARY ADSINTERFACE
;DESCRIPTION 'A C++ dll that allows viewing/editing of alternate data streams'

EXPORTS
  newMain @1

奇怪的是,我能够用这一行在 C# 中导入该方法(我也不必包含 .lib 文件):

[DllImport("./adsInterface.dll")] private static extern void newMain();

当我正常调用它时它会运行:

newMain();

我已经阅读了许多关于如何导入 dll 函数的不同指南,并且我已经达到了我认为我只是将语言之间的不同导入方式组合在一起并且只是把事情弄得一团糟的地步。如果有人能够提供一些关于我应该如何在 C++ 中导入 dll 方法的见解,那将不胜感激。

4

1 回答 1

1

删除此声明:

extern "C" int __stdcall newMain();

并从 _tmain 调用 ADSInterface::newMain()。

在发布的代码中,您没有定义与该声明匹配的任何内容,是吗?

或者使实现调用另一个,或将一个从命名空间拖到全局。

于 2013-06-27T14:39:45.667 回答