2016-03-29 18 views
-1

Ich versuche, eine Funktion CreateGameClient genannt zu exportieren und wenn ich dumpbin/export bekomme ich diese stattdessen [email protected]@YAXXZ und das Programm, das ich die DLL in Bedürfnisse bin Injektion CreateGameClient und nicht [email protected]@YAXXZC++ dll export verstümmelten Name

Und ich bin mit Visual Studio 2012, wenn das

hilft

Dies ist mein Code ExpFunc.h

#ifndef INDLL_H 
#define INDLL_H 

#ifdef EXPORTING_DLL 
    __declspec(dllexport) void CreateGameClient() ; 
#else 
    __declspec(dllimport) void CreateGameClient() ; 
#endif 

#endif 

Main.cpp

#include "stdafx.h" 
#include <Windows.h> 
#include <string.h> 
#include <sstream> 
#include <stdio.h> 
#include <fstream> 
#define EXPORTING_DLL 
#include "ExpFunc.h" 

void WriteLogFile(const char*); 
void CreateGameClient2(int); 

char* logStr; 
char* CGCNStr; 
char buf[250]; 
DWORD pid = GetCurrentProcessId(); 

BOOL APIENTRY DllMain(HMODULE hModule, 
         DWORD ul_reason_for_call, 
         LPVOID lpReserved 
        ) 
{ 

    switch (ul_reason_for_call) 
    { 
     case DLL_PROCESS_ATTACH: 
     case DLL_THREAD_ATTACH: 
      logStr = "Attached To: %d"; 
      sprintf(buf, logStr, pid); 
      WriteLogFile(buf); 
      break; 
     case DLL_THREAD_DETACH: 
     case DLL_PROCESS_DETACH: 
      logStr = "Detached To: %d"; 
      sprintf(buf, logStr, pid); 
      WriteLogFile(buf); 
      break; 
    } 
    return TRUE; 
} 

void CreateGameClient() 
{ 
    CreateGameClient2(2); 
} 

void CreateGameClient2(int num) 
{ 
    std::stringstream temp_str; 
    temp_str << (num); 
    std::string str = temp_str.str(); 
    const char* cstr2 = str.c_str(); 

    sprintf(buf, cstr2, pid); 
    WriteLogFile(buf); 
} 

void WriteLogFile(const char* szString) 
{ 
    FILE* pFile = fopen("logFile.txt", "a"); 
    fprintf(pFile, "%s\n",szString); 
    fclose(pFile); 

} 

Ich habe C++ DLL Export: Decorated/Mangled names versucht

aber noch nicht

+0

Welche Lösung von verknüpften Frage haben Sie ausprobiert? 'extern" C "? –

+0

[Demangling] (http://demangler.com/) von "CreateGameClient @@ YAXXZ" gibt tatsächlich "void __cdecl CreateGameClient (void)", was in Ihrem Fall richtig ist. – Mahesh

+0

Ich versuchte Hans Passant Lösung hat nicht funktioniert – DavidTheTech

Antwort

2

funktionierten Sie müssen sowohl die Deklaration und Definition einer Funktion dekorieren mit extern "C" __declspec(...) sonst sollten Sie eine Warnung über nicht konsequente Verknüpfung Definition und unberechenbares Verhalten bekommen .

+0

können Sie mir zeigen, wo ich es setzen muss? – DavidTheTech

+0

Sie haben CreateGameClient() auch in der CPP-Datei. Fügen Sie extern "C" __declspec() zu seiner Signatur hinzu, damit es genau wie in der Header-Datei aussieht. – jszpilewski

+0

OK danke Es funktioniert jetzt – DavidTheTech