我有我的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 Walker
build议:
我也改变了以下(在我的主要),但它仍然无法正常工作。
typedef void (__cdecl *p_sort)(int*, int);
该函数与装饰名称一起导出。 出于调试的目的,当遇到这种情况时,可以使用dumpbin
或Dependency Walker来找出这个名字是什么。 我预测它会是: _sort@8
。 __stdcall
调用约定的文档给出了如下装饰规则:
名称装饰约定 :下划线(_)以名称为前缀。 名称后面跟着at号(@),后面是参数列表中的字节数(十进制)。 因此,声明为
int func( int a, double b )
函数装饰如下:_func@12
您必须执行以下操作之一:
__cdecl
来避免装饰。