【问题标题】:Could not locate the function dllexport找不到函数 dllexport
【发布时间】:2014-06-10 10:37:40
【问题描述】:

我有我的 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;
}

问题是我的函数sort colud没有找到,即函数GetProcAddress总是返回NULL

为什么?我该如何解决?

编辑:按照建议使用__cdecl(在dll项目中而不是__stdcall)和Dependency Walker

我还更改了以下内容(在我的主要内容中),但它仍然不起作用。

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

【问题讨论】:

  • 如果你要使用GetProcAddress,那么你需要使用一个DEF文件来删除装饰。

标签: windows visual-studio dll dllexport


【解决方案1】:

函数以修饰名称导出。出于调试目的,当遇到这种情况时,请使用dumpbin 或 Dependency Walker 找出该名称是什么。我预测它将是:_sort@8__stdcall 调用约定的 documentation 给出如下装饰规则:

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

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

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

【讨论】:

  • 我尝试用 __cdecl 替换 __stdcall,但还是遇到了同样的错误。
  • 让我猜猜,您只更改了 exe,但没有更改 dll。
  • 当您使用 dumpbin 或 Dependency Walker 查看 DLL 时?
  • 如果我使用 Dependency Walker,我可以看到函数名称是 _sort@8(当我使用 stdcall 时),所以我将字符串“sort”更改为“_sort@8”作为 GetProcAddress 函数参数,并且我仍然得到同样的错误:找不到函数...
  • 如果函数导出为_sort@8,则为__stdcall。如果函数导出为_sort@8,则将"_sort@8" 传递给GetProcAddress 将成功。您很可能对重建、复制文件、使用过期文件等感到困惑。我的回答中的信息是准确的。
猜你喜欢
  • 2020-01-22
  • 1970-01-01
  • 2016-02-18
  • 2021-09-17
  • 2012-02-11
  • 1970-01-01
  • 2022-12-14
  • 2022-10-05
相关资源
最近更新 更多