Вызов экспорта из DLL в C ++ с именами строк "::" - PullRequest
0 голосов
/ 10 июля 2019

У меня есть внешний файл DLL с именами функций как «Test123 :: MyFunction», проблема в том, что я могу успешно вызывать имена DLL, если имя не содержит символа «::», как я могу передать полную функцию имя "Test123 :: MyFunction" в вызове DLL?

Полный код ресурса:

#include "pch.h"
#include <stdio.h>
#include <Windows.h>
#include <iostream>
int MyFunction(char* buf);
int main(int argc, char** argv)
{
    /* get handle to dll */
    HINSTANCE hGetProcIDDLL = LoadLibrary(L"CallMe.dll");

    /* get pointer to the function in the dll*/
    FARPROC lpfnGetProcessID = GetProcAddress(HMODULE(hGetProcIDDLL), "MyFunction"); // Here the name MyFunction should be Test123::MyFunction

    typedef int(__stdcall * pICFUNC)(char *);

    pICFUNC MyFunction;
    MyFunction = pICFUNC(lpfnGetProcessID);

    /* The actual call to the function contained in the dll */
    int intMyReturnVal = MyFunction(argv[1]);

    /* Release the Dll */
    FreeLibrary(hGetProcIDDLL);

    return intMyReturnVal;

    /* The return val from the dll */

}

Спасибо

1 Ответ

1 голос
/ 10 июля 2019

В установке Visual C ++ должна быть небольшая утилита dumpbin.exe.Если вы добавите это в свою C ++ DLL, вы сможете составить список искаженных имен для методов C ++, которые вы экспортировали.Это те текстовые имена, которые вы хотите передать в GetProcAddress.

Большинство людей, однако, отключили бы искажение имен в экспортированных функциях, просто выполнив:

extern "C" void __declspec(dllexport) startPicadorVisual(string fixtureNamet);
extern "C" PicadorResults __declspec(dllexport) getPicadorReading(string fixtureName);

, который будет экспортировать имена функций как «startPicadorVisual» и «getPicadorReading».ПРИМЕЧАНИЕ. При экспорте функций с использованием соглашения об именовании C это означает, что вы не сможете использовать перегрузку функций (поскольку оба эти функционала будут иметь одно и то же имя).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...