调用DLL明确

谁能告诉我为什么我的SimpleTest的应用程序不会显示“测试”? DLL加载成功,我只是没有得到任何控制台输出。

SimpleDLL.cpp

#include "stdafx.h" #include "SimpleDLL.h" #include "stdafx.h" #include <iostream> int Test() { std::cout << "Test" << std::endl; return 0; }

SimpleDLL.h

#ifndef _DLL_TUTORIAL_H_ #define _DLL_TUTORIAL_H_ #include <iostream> #if defined DLL_EXPORT #define DECLDIR __declspec(dllexport) #else #define DECLDIR __declspec(dllimport) #endif DECLDIR int Test(); #endif

SimpleTest.cpp

#include "stdafx.h" #include <iostream> #include <windows.h> typedef int (*TestFunc)(); int main() { TestFunc _TestFunc; HINSTANCE hInstLibrary = LoadLibrary( _T("SimpleDLL.dll")); if (hInstLibrary) { _TestFunc = (TestFunc)GetProcAddress(hInstLibrary, "Test"); } else { std::cout << "DLL Failed To Load!" << std::endl; } if (_TestFunc) { _TestFunc(); } FreeLibrary(hInstLibrary); return 0; }

--------------解决方案-------------

需要声明extern "C"之前__declspec(...) 这是因为C ++增加名字的装饰当您导出一个C ++函数,你需要将其声明为一个C函数具有的功能Test导出为只是“测试”

由于已被JoesphH说明你需要extern "C"以防止名字改编。 除了这个没有任一指定以下编译器开关:

  • GZ __stdcall调用约定:“测试”将出口作为Test@0
  • GR __fastcall caling约定:“测试”将出口作为@Test@0

注:我觉得最后一个符号是依赖于编译器的版本,但仍然不只是“测试”。

另外,根据从我的评论检查返回值GetProcAddress()并使用的值GetLastError()来获得,失败的原因,如果返回NULL。

分类:C# 时间:2015-03-15 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.910 (s). 10 q(s)