找不到函数dllexport

我有我的dll项目

// .h #pragma once #include <stdio.h> extern "C" { void __declspec(dllexport) __stdcall sort(int* vect, int size); } //.cpp #include "stdafx.h" void __declspec(dllexport) __stdcall sort(int* vect, int size) { } 

我有我的控制台项目:

 #include <Windows.h> #include <tchar.h> #include <stdio.h> #include <stdlib.h> /* Pointer to the sort function defined in the dll. */ typedef void (__stdcall *p_sort)(int*, int); int _tmain(int argc, LPTSTR argv[]) { p_sort sort; HINSTANCE hGetProcIDDLL = LoadLibrary("dllproj.dll"); if (!hGetProcIDDLL) { printf("Could not load the dynamic library\n"); return EXIT_FAILURE; } sort = (p_sort)GetProcAddress(hGetProcIDDLL, "sort"); if (!sort) { FreeLibrary(hGetProcIDDLL); printf("Could not locate the function %d\n", GetLastError()); return EXIT_FAILURE; } sort(NULL, 0); return 0; } 

问题是我的函数sortingcolud不能被定位,即GetProcAddress函数总是返回NULL

为什么? 我该如何解决它?

编辑:使用__cdecl (在dll项目,而不是__stdcall )和Dependency Walkerbuild议:

在这里输入图像说明

我也改变了以下(在我的主要),但它仍然无法正常工作。

 typedef void (__cdecl *p_sort)(int*, int); 

该函数与装饰名称一起导出。 出于调试的目的,当遇到这种情况时,可以使用dumpbin或Dependency Walker来找出这个名字是什么。 我预测它会是: _sort@8__stdcall调用约定的文档给出了如下装饰规则:

名称装饰约定 :下划线(_)以名称为前缀。 名称后面跟着at号(@),后面是参数列表中的字节数(十进制)。 因此,声明为int func( int a, double b )函数装饰如下: _func@12

您必须执行以下操作之一:

  1. 导入时使用装饰名称。
  2. 使用__cdecl来避免装饰。
  3. 用.def文件导出以避免装饰。