我找不到在我的工作的情況下在網絡的任何解決方案中使用。我的Microsoft Developer Network讀取,從這裏的問題和幾個維基,但沒有什麼,但看完這麼多的信息和一些矛盾給別人......我有一個爛攤子後!創建一個MinGW的DLL與一個VB EXE
我的歷史:
1 - 我不得不改變軟件在Visual C已經創建++(一個DLL),我不知道是哪的Visual Studio來編譯它,這個DLL是使用Visual Basic工作程序。
在改變程序使用其他通信協議(即是改變...容易)和2 - 我的成功,我已經使用的Visual Studio 2012,我在我的電腦上一些.NET的問題,但我糾正他們,我的電腦應該罰款,以及我調試DLL,並在我的電腦完美的工作,但每當我把DLL到另一個使得運行時錯誤53(沒有找到文件),究竟沒有找到是MSVCP110D。 dll庫,我猜是因爲是VS 2012庫(編譯器vc11.0看起來像是因爲它),所以我決定下一步:
3-我決定將它遷移到Mingw,因爲我聽說可以創建DLL與VB EXE兼容,確定我安裝Eclipse和MinGW,並再次修改我的C++代碼,以適應MinGW的編譯器和天秤座里斯,現在我創建DLL,也.DEF和庫的.lib(好,我重命名擴展.a)中第一次給了我無法找到函數名的錯誤,然後我就把:
#ifdef __cplusplus
extern "C" {
#endif
和__stdcall(因爲__cdecl
不是用於msvc,我讀的),在這個改變後運行時錯誤改變爲48(我讀這是加載DLL的問題),我檢查可能是.def的問題,嘗試建立與此.DEF全光照從VS 2012編譯器LIB.EXE和DUMPBIN一個新的DLL(但它不能正常工作)。我刪除了DllMain(它用於任何程序找到初始化的入口點),但我評論,因爲我沒有初始化任何東西,在這裏我粘貼一些我的代碼。
.H:
#define DLL_TESTER VB // define whenever I use the dll with the VB.exe
#ifdef DLL_TESTER
#ifdef DLLTRY_EXPORTS
//after I use the option -DCPDLLEXPORT to define and set the value to __declspec(dllexport)
#define ADDCALL __declspec(dllexport)
#else
#define ADDCALL __declspec(dllimport)
#endif
#define DLLTRY __stdcall
//this is supposly the correct one for VB.exe calls but try the __cdecl neither
#else
//if is not with a VB.exe the tester would be a C application
#define EXTDLLCALL __cdecl
#ifdef DLLTRY_EXPORTS
#define ADDCALL __declspec(dllexport) EXTDLLCALL
#else
#define ADDCALL __declspec(dllimport) EXTDLLCALL
#endif
#endif
五月的順序是錯的,但我嘗試很多不同的順序,沒有工作的: __declspec(dllexport)
返回值(INT)與__stdcall前__cdecl
旁邊或返回值的另一邊, 在前面加上__stdcall
和cdecl
...每個訂單(因爲我看到了不同的訂單和每一個工作),但相同的運行時錯誤48.
#include <string>
#include <Windows.h>
#ifdef __cplusplus
extern "C" {
#endif
因爲有一個環節出現問題,如果只是聲明爲C++,所以應該是C被正確連接到VB.EXE(不同的編譯器)
我定義然後一些枚舉和結構,我認爲是好的,但如果在函數調用中存在此結構作爲參數,那麼我可能還應該導出結構?,在以前的版本中不是......但是我創建了一個沒有參數的函數,它也不能工作。
enum ERROR_DLL{ SUCCESS_CP_OK = 0,SUCCESS_CP_CANCELLED = 1}
struct SDllIdentity{
LPCSTR szID;
LPCSTR szDeviceID;
}
這就是爲什麼我包括WINDOWS.H,因爲這是工作,我想是因爲我沒有使用LPCSTR是一個char *類型它是失敗的VS2012,但即使我改變它爲char *呢不行。
int __stdcall __declspec(dllexport) InitialiseTerminal(const SDllIdentity* pSDllIdentity, LPCSTR szAddress, int nPort);
//May the order is wrong, but as previously said I tried diferent combinations
int __stdcall __declspec(dllexport) DisconnectTerminal(const SDllIdentity* pSDllIdentity);
//ADDCALL int DLLTRY DisconnectTerminal(const SDllIdentity* pSDllIdentity);
#ifdef __cplusplus
}
#endif
的.cpp:
#include "dlltry.h"
//then I define some variables and a class, but I don't want to be exported
__stdcall int InitialiseTerminal(const SDllIdentity* pSDllIdentity, LPCSTR szAddress, int nPort) { return 0;}
__stdcall int /*ADDCALL*/ DisconnectTerminal(const SDllIdentity* pSDllIdentity) { return 0; }
我並沒有包括所有的功能,但所有的看起來是一樣的,我希望我不會忘卻了「;」 :S,我看着這一切的網站:
http://www.transmissionzero.co.uk/computing/building-dlls-with-mingw/ http://msdn.microsoft.com/en-us/library/z4zxe9k8.aspx
我試圖.DEF midify,創建libdlltrx.a,所有我閱讀,我 僅次於解決辦法是安裝VS2008,因爲我認爲編譯 與那一個......但不知道,請閱讀,我讓它在 之前工作,但由於不兼容,我不能在其他人運行它,我不想 想要在其他PC上安裝任何其他軟件。
我知道會解決這個問題,但我無法在目標系統中安裝resdistributable組件,我不允許安裝任何東西,只包含一個dll,這是主要問題,我工作過很多,並且讀了很多,如果我不做,我會遇到嚴重的問題,因爲我有很多使用eclipse的經驗,而不是使用Visual Studio,所以完全可以使用Mingw,但最終我會嘗試用如果明天之前我沒有在Mingw找到解決方案,VS 2008:S。 非常感謝:)。 – seak
您可以檢查安裝了哪些可再發行組件*並使用該版本的Visual Studio。這樣,你就不需要安裝新的東西。儘管爲了安全起見,如果該目標系統在VB出來後還沒有補丁,那麼最好還是尖叫。 – nvoigt
我發現了!!!,是一個愚蠢的事情,因爲alwas發生了......我的上帝!, 只是Visual Studio平臺中的一個編譯選項, 如果您去項目解決方案屬性,請轉到C/C++>代碼生成,將運行時庫從MDd更改爲MTd,它允許不依賴於來自特定平臺的外部庫的運行時,它們將在編譯時間內靜態鏈接,而不需要安裝可再發行組件組件! Wooooaaahh! – seak