討論區快速選單
知識庫快速選單
軟體開發過程中有哪些資安漏洞? 討論區最近新進100則主題 傑米的攝影旅遊筆記
[ 回上頁 ] [ 討論區發言規則 ]
VB的Dll 如何使用c++呼叫
更改我的閱讀文章字型大小
作者 : wlongsen(wlongsen)
[ 貼文 6 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2014/10/20 下午 03:23:00
大家好:

我想請教我使用VB寫的Dll, 再C++如何呼叫?

網路上看到別人的範例, 可是似乎在Import時, 就發生以下錯誤, 還希望高手指教.

錯誤:
C:\TESTDLLM\TESTDLL\TESTDLL.dll:1:1: error: stray '\220' in program
.................................................
.................................................

使用的開發軟體為Code Block
編譯器為mingw
VB 6 Dll原始碼:
public Sub SayHello()
    MsgBox "Hello!", vbInformation, "VBDll"
End Sub

public function iString(a as String, b as String) as String
    Dim c as String
    c = a + "," + b
    iString = c
End function

C++原始碼:
#import "C:\TESTDLLM\TESTDLL\TESTDLL.dll"

int main()
{
    return 0;
}
作者 : ozzy123(ozzy) 資訊類作業求救卓越專家C++卓越專家貼文超過4000則人氣指數超過30000點
[ 貼文 4473 | 人氣 37262 | 評價 10900 | 評價/貼文 2.44 | 送出評價 49 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人wlongsen註記此篇回應為很有道理 2014/10/20 下午 03:40:38
http://www.ehow.com/how_6331619_call-visual-basic-dll-c.html
作者 : ozzy123(ozzy) 資訊類作業求救卓越專家C++卓越專家貼文超過4000則人氣指數超過30000點
[ 貼文 4473 | 人氣 37262 | 評價 10900 | 評價/貼文 2.44 | 送出評價 49 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2014/10/20 下午 03:43:06
http://www.codeproject.com/Articles/714/Calling-a-VB-ActiveX-DLL-from-a-MFC-Client
作者 : wlongsen(wlongsen)
[ 貼文 6 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2014/10/22 下午 01:17:18
感謝大大回覆~

我試過裡面的方法了,不過似乎無法GetProcAddress

於是我爬了下面的文章,他還是叫我用Import,可是我就找不到為甚麼Import會發生我一開始問的錯誤,有沒有大大可以指點一下?謝謝
http://bytes.com/topic/c/answers/735696-getprocaddress-fail-vc-app-while-using-vb-dll
作者 : ice_emissary(燃燒的大地) 貼文超過200則
[ 貼文 386 | 人氣 0 | 評價 1770 | 評價/貼文 4.59 | 送出評價 17 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2014/10/22 下午 01:54:57
使用 GetProcAddress 的時候記得要帶入函式真正的名稱,就是被編譯器加上了修飾後的名稱,比方說 _Function@4 之類的。
我喜歡用的方法是:用 Notepad++ 打開 DLL 檔案,在裡面搜尋 DLL 檔名(含副檔名,比如說 mymod.dll),通常只會搜到一個結果。然後搜尋到的位置後面就是一串這個 DLL 有 Export 的函式名稱列表了。
作者 : ozzy123(ozzy) 資訊類作業求救卓越專家C++卓越專家貼文超過4000則人氣指數超過30000點
[ 貼文 4473 | 人氣 37262 | 評價 10900 | 評價/貼文 2.44 | 送出評價 49 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2014/10/22 下午 03:32:37
http://msdn.microsoft.com/zh-tw/library/windows/desktop/ms683212(v=vs.85).aspx
作者 : wlongsen(wlongsen)
[ 貼文 6 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2014/10/22 下午 03:41:32
謝謝回覆~ 我試著照方法去做, 看到的是一對NUL、ESC與一些亂碼之類的文字. 找到該XXXX.dll之後, 有看到function的名子, 似乎沒有被修改.

問這個問題最主要的原因是:

我工作上需要使用MX Component3去寫入PLC(工業自動化的控制器)的資料,這個Library有VB、VC的Sample Code與範例。可是我必須使用原始的C++來開發。由於我用code block來載入該DLL會發生錯誤,所以我想用VB來再包一層,再給C++使用。

不過料不到用VB開發的DLL在C++使用,看起來發生同一個問題(就是一開始問的問題),所以我想如果我可以把VB DLL成功給C++使用,我可能就可以直接使用該Library。

這個問題我爬了一些文,看起來真的如他們所說,VB的DLL與一般的DLL不同,因為是Class的,所以GetProcAddress無法取得該Function。該如何是好?有沒有前輩可以指點一下。

謝謝
作者 : ice_emissary(燃燒的大地) 貼文超過200則
[ 貼文 386 | 人氣 0 | 評價 1770 | 評價/貼文 4.59 | 送出評價 17 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人wlongsen註記此篇回應為最佳解答 2014/10/22 下午 09:43:05
> 這個Library有VB、VC的Sample Code與範例。
既然有 VC 的範例,那應該就可以用了吧,除非他的 VC 指的是 VC .Net,或是用了很多 VC 特殊指令。理論上主要把靜態連結函式庫改成 GetProcAddress 就是。

> 由於我用code block來載入該DLL會發生錯誤,所以我想用VB來再包一層,再給C++使用。
應該和 CodeBlocks 沒有關係,你用的編譯器應該是 MinGW GCC。不過用 VB 再包一層給 C++ 用倒是蠻特別的,可能是我比較熟 C++ 吧!總覺得直接用 C++ 成功率較高。

至於連結別人的 DLL 這件事,我也有一些好玩的經驗。

1. 如果對方的 DLL 是中規中矩、由一群高素質程式人員做出來的東西的話,理論上很容易使用,大部份就是針對不同編譯器的 Import Library 轉包裝而已,頂多用用 GetProcAddress 就搞定了。

2. 如果對方的 DLL 是 .Net 的,基本上別想了,用 C# 或 VB .Net 來連吧!這牽扯到拖管程式和原生程式的不同,已經不是單純的函式呼叫這麼簡單了。

3. 如果對方的 DLL 是個 COM 元件,則肯定可以用 C/C++ 來連,畢竟 COM 元件一開始的目的就是要讓所有的程式語言都合作「愉快」。只是操作很複雜,一般來說我是邊做邊罵!

4. 如果對方的 DLL 是個 ActiveX 元件,這我沒輒,太複雜了。編譯器比如說 C++ Builder 或 Visual C++ 有提供相關的工具包的話就用吧,我目前還沒有用 C/C++ 加 Windows API 呼叫來成功使用過 ActiveX 的東西。

另外,我還遇過一個狀況,那是一間臺灣有名的大公司出品的 C++ Library,用來接收網路上的某種資料。
其實他們的 API 並不複雜,函式也很少。我照著他們的 API 文件寫作 Console 程式做測試(後來發現 Console 是問題的主要所在),結果無論如何都收不到任何資料,我設定的 Callback 函式也沒有被執行。
後來我朝者 MFC 的方向去懷疑,於是我寫個一個執行緒就只在背景做這件事:

MSG msg;
while( GetMessage(&msg, NULL, 0, 0) )
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

然後我就收到資料了…
此時的我超想衝去他們公司罵人!
這件事讓我知道,對方開發人員的素質是很重要的,不是只有一個好的 API 介面而已(況且他們 API 介面其實並沒有很好)。
作者 : ice_emissary(燃燒的大地) 貼文超過200則
[ 貼文 386 | 人氣 0 | 評價 1770 | 評價/貼文 4.59 | 送出評價 17 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2014/10/22 下午 09:48:12
另外,不會因為對方的 API 是 class 的而導致 GetProcAddress 失敗。GetProcAddress 只管取得指標而已,只要對方有 Export function 就一定可以抓到,唯一的差別是你的程式碼能不能正確的理解與使用該函式。
如果他的 class Member functions 是虛函式,那大概是可以直接用的;如果對方的 class Member functions 是一般的靜態連結函式,那對方的素質一定不高,你就保重吧!
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2014/10/22 下午 09:54:32
看看這個有沒有幫助:
https://social.msdn.microsoft.com/Forums/vstudio/en-US/850b6ae0-6efa-4ba2-a4bc-c4dae7101efc/using-a-vb6-dll-in-vc?forum=vcgeneral
作者 : wlongsen(wlongsen)
[ 貼文 6 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2014/10/23 上午 08:55:43
感謝ice_emissary大,回覆的很詳細,我想至少給我一點方向。
作者 : wlongsen(wlongsen)
[ 貼文 6 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2014/10/23 上午 09:08:29
>另外,不會因為對方的 API 是 class 的而導致 GetProcAddress 失敗。GetProcAddress 只管取得指標而已,只要對方有 Export function 就一定可以抓到,唯一的差別是你的程式碼能不能正確的理解與使用該函式。
>如果他的 class Member functions 是虛函式,那大概是可以直接用的;如果對方的 class Member functions 是一般的靜態連結函式,那對方的素質一定不高,你就保重吧!

再次請教
我自製的VB6的DLL,在LoadLibrary有成功,不過GetProcAddress時,卻沒有返回值(應該說返回值為0?),這是否代表編譯器抓不到該Function?這其中的可能性為何?


typedef UINT16 (*LPFNDLLFUNC1)(UINT16);

HINSTANCE hDLL; // Handle to DLL
LPFNDLLFUNC1 lpfnDllFunc1; // function pointer
Uint uReturnVal;

hDLL = LoadLibrary("C:\\TESTDLLM\\TESTDLL\\TESTDLL.dll");
if (hDLL != NULL)
{
    lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL,"GetI");

.....................................
作者 : wlongsen(wlongsen)
[ 貼文 6 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2014/10/23 上午 09:14:32
恩恩~VB6的專案類型就是ActiveX DLL @@
 板主 : 徵求中
 > C++ Builder - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - C++ Builder - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
C++ Builder
1 windblown 5420 
2 Raynor 3120 
3 阿泰 2980 
4 workman 1650 
5 Linkin 1360 
6 CrazyStar 1260 
7 青衫 1160 
8 jonay 1080 
9 charlie 900 
10 小呆 770 
C++ Builder
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2018 程式設計俱樂部 http://www.programmer-club.com.tw/
0.109375