簡體   English   中英

將C ++ DLL與錯誤的導出一起使用

[英]Using a C++ DLL with mangled exports

我被分配了以DLL形式圍繞現有C ++代碼庫編寫包裝器的工作。 我正在運行的問題是DLL導出名稱已損壞。 將名稱傳遞給GetProcAddress時,是否可以/應該僅使用變形的名稱? 還是有更好的做事方法?

編輯:我沒有提及。 我無權訪問代碼,以便允許我以任何方式修改dll。

EDIT2:事實證明我確實可以訪問此DLL的代碼(.h和.cpp),但我無法修改所述代碼。

由於您擁有源代碼(不可修改)。

用DLL源代碼文件創建一個項目。 使用以下命令創建wrapper.cpp / wrapper.h

// wrapper.h

#ifndef WRAPPER_H
#define WRAPPER_H

extern "C" {

    void wrapper_function1();
    // and so on
}
#endif

// wrapper.cpp

#include "wrapper.h"
#include "dll.h"

extern "C" {
    void wrapper_function1() { /* code which may call functions from dll.h */ }
    // And so on
}

因此,您的新DLL沒有名稱修改。

我最終針對我提出的具體問題解決的解決方案是以下功能。 在我的案例中,這很有用,因為出口名稱只被稍微弄亂了。

static FARPROC getFunctionPointer(HINSTANCE dll, const char *baseName)
{
    char buf[256];
    FARPROC fp;
    sprintf(buf,"%s",baseName);
    fp = GetProcAddress(dll,buf);
    if (fp == 0)
    {
      sprintf(buf,"_%s",baseName);
      fp = GetProcAddress(dll,buf);
    }
    if (fp == 0)
    {
      sprintf(buf,"_%s@4",baseName);
      fp = GetProcAddress(dll,buf);
    }
    if (fp == 0)
    {
      sprintf(buf,"_%s@8",baseName);
      fp = GetProcAddress(dll,buf);
    }
    if (fp == 0)
    {
      sprintf(buf,"_%s@0",baseName);
      fp = GetProcAddress(dll,buf);
    }

    if (fp == 0)
    {
        printf("ERROR: Could not locate function: %s \n", baseName);
    }
    return fp;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM