2013-06-27 60 views
0

我想編寫和測試一個C++的dll文件,我可以調用,只要我想文件系統級訪問的東西。當我試圖在C++中訪問這個DLL中的方法時,我目前非常頭痛。奇怪的是,我能夠在一個單獨的C#程序中調用代碼而沒有什麼麻煩,但我想了解dll交互在C++中如何工作。麻煩從C++ DLL錯誤導入功能LNK 2019

這是我的虛擬可執行文件的.cpp文件,應該只能調用我的「newMain」測試方法。

// dummy.cpp : Defines the entry point for the console application. 
// 

#include "stdafx.h" 
#include <iostream> 
#include <string> 
//#pragma comment(lib,"visa32.lib") 
#pragma message("automatic link to adsInterface.dll") 
#pragma message(lib, "adsInterface.lib" 

extern "C" int __stdcall newMain(); 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
newMain(); 
std::string i; 
std::cin >> i 
return 0; 
} 

問題是,當我運行它,我得到這個錯誤:

error LNK2019: unresolved external symbol [email protected] referenced in function _wmain 
error LNK1120: 1 unresolved externals 

這裏是adsInterface的.H:

// adsInterface.h 

#ifndef ADSINTERFACE_H 
#define ADSINTERFACE_H 

/* //save this for later i have no clue how this really works. 
#ifdef ADSAPI_EXPORTS 
#define ADSAPI __declspec(dllexport) 
#else 
#define ADSAPI __declspec(dllexport) 
#endif 
*/ 

namespace ADSInterface 
{ 
    //test method. should print to console. 
    __declspec(dllexport) int __stdcall newMain(); 

    void hello(); 
} 
#endif 

,這裏是我的adsInterface的.cpp :

// adsInterface.cpp : Defines the exported functions for the DLL application. 
// 

#include "stdafx.h" 
#include "adsInterface.h" 
#include <iostream> 

namespace ADSInterface 
{ 
    /* this is where the actual internal class and other methods will go */ 

    void hello() 
    { 
    std::cout << "hello from the DLL!" << std::endl; 
    } 


    __declspec(dllexport) int __stdcall newMain() 
    { 
    hello(); 
    return 0; 
    } 
} 

我還會加UDE .def文件我用編譯DLL時:

; adsInterface.def - defines exports for adsInterface.dll 

LIBRARY ADSINTERFACE 
;DESCRIPTION 'A C++ dll that allows viewing/editing of alternate data streams' 

EXPORTS 
    newMain @1 

奇怪的是,我能夠導入C#中的方法與這條線(我沒得包含的.lib文件其一):

[DllImport("./adsInterface.dll")] private static extern void newMain(); 

它跑了,當我把它叫做正常:

newMain(); 

我一直在閱讀有關如何導入DLL函數許多不同的導遊,我已經達到了,我想我只是點以不同的方式混合在一起在各種語言之間輸入,而只是搞亂了一些東西。如果有人能夠提供一些關於我應該如何導入C++中的dll方法的深入瞭解,我們將非常感謝。

回答

1

刪除此聲明:

extern "C" int __stdcall newMain(); 

和_tmain調用ADSInterface :: newMain()。

在發佈的代碼中,您沒有定義與該聲明相匹配的任何內容,是嗎?

或者使實現調用另一個,或者將名稱空間中的一個拖到全局。

+0

''包括'dummy.cpp'中的'#include「adsInterface.h」' –

+0

偉大的工作,感謝所有的幫助。我正在把頭髮撕掉。只是一個小問題,有沒有辦法讓我不必包含頭文件?像這樣我只需要提供該DLL作爲資源? – Drigax

+0

您可以使用正確的聲明,因爲它當前位於標題中 - 位於名稱空間內。你不會把整個麻煩放在名字空間的首位:)。 –