我使用了在網上下載的“ DLL---VB_DLL_Link ”插件,按照上面的方法用VB6.0生成了一個簡單的加法函式的DLL,用VB測驗呼叫成功。但是在VC里呼叫的時候卻出現了問題,我已將function.dll檔案復制到VC測驗工程的檔案夾下面,呼叫程式沒報錯,但是運行的時候會彈出視窗說dllcall1.exe已停止作業。
下面是VB 函式代碼:
function.dll
Function DllMain(ByVal hInstDLL As Double, ByVal fdwReason As Double, ByVal lpwReserved As Double) As Double
DllMain = 1
End Function
Sub Main()
End Sub
Function Add(ByVal A As Double, ByVal B As Double) As Double
MsgBox A + B
Add = A + B
End Function
Private Sub M(s As String)
MsgBox s, vbInformation
End Sub
下面是我的VC呼叫程式:
dllcall1.cpp
#include <stdio.h>
#include <windows.h>
typedef int(*lpAddFun)(int, int);
int main(int argc, char *argv[])
{
HINSTANCE hDll;
lpAddFun addFun;
hDll = LoadLibrary("function.dll");
if (hDll != NULL)
{
addFun = (lpAddFun)GetProcAddress(hDll, "Add");
if (addFun != NULL)
{
int result = addFun(2, 3);
printf( "%d", result);
}
FreeLibrary(hDll);
}
return 0;
}
\\測驗VC寫的DLL沒問題。
我是初學者,老師給了個任務,最后目的是要找到一個方法讓VB寫的DLL在VC和JAVA里能呼叫。
從找資料到寫程式弄了兩周了,現在已經沒頭緒了,不知道是不是VB與VC的資料介面問題。
如果能得到幫助,我將感激不盡。
謝謝了。
uj5u.com熱心網友回復:
VB根本沒法“撰寫標準dll”,你以為那個hack linker,使得VB標準模塊的函式被添加到匯出表的方法很好使,事實上那個東西根本就是哄騙菜鳥的。uj5u.com熱心網友回復:
typedef int(*lpAddFun)(int, int);宣告是否錯誤了,dll中的宣告的是double
uj5u.com熱心網友回復:
VC與JAVA都不能呼叫COM組件么?
uj5u.com熱心網友回復:
VC可以呼叫com組件uj5u.com熱心網友回復:
VC和JAVA都可以呼叫COM組件。
uj5u.com熱心網友回復:
您好:
現在網上說的那些利用 VB 兩次編譯的方法生成標 DLL 的方法是不是僅僅基于在 VB 里用 “ Declare Function ..... ” 來呼叫的。而在 VC 或 JAVA 里呼叫根本沒法實作呢。
那我們老師給我的任務就是無解了,他最先給我的資料一些利用VB兩次編譯的程序在LINK的時候添加EXPORT選項的一些方法。我用您的插件做好了DLL,用 VB 可以調,用 VC 調就出現問題。
我們老師是覺得用 VB 做一些控制元件比較簡單,直接用 C 寫很麻煩,而且他說那些要注冊的方法也很麻煩,換臺電腦就又要注冊,他的主程式還是用 C 和 JAVA 寫,所以要做一個標準 DLL 函式庫供 VC 和 JAVA 程式呼叫。
要是有解的話能給我方向我繼續研究么,謝謝了。
uj5u.com熱心網友回復:
看看我的這篇文章:http://blog.csdn.net/supermanking/article/details/3082809
uj5u.com熱心網友回復:
你把那句 msgbox 去掉試試uj5u.com熱心網友回復:
VB寫的不用注冊的DLL(也就是所謂的標準的DLL,實際上不是標準的,因為它要呼叫個VB的一個DLL庫檔案),關于數字處理的函式,我測驗過,用C++,VFP呼叫都成功了的.惟獨關于字符處理的,貌似跨語言暫時不行,抽空再搞搞看.
uj5u.com熱心網友回復:
VB進行串處理的函式要初始化環境才能使用,因為你的DLL沒有進行VB初始化,當然有問題了uj5u.com熱心網友回復:
字串的情況復雜些,因為涉及到字符集轉換.參考:
http://www.m5home.com/bbs/thread-1698-1-1.html
uj5u.com熱心網友回復:
不知掉樓主搞定沒。我撰寫的dll用vc呼叫成功了,但僅限xp下能正常運行,64位win7下就報錯。而且64位win7下用vb呼叫也是正常的,很奇怪。
uj5u.com熱心網友回復:
不要做A語言代碼修改為B語言代碼的無用功。也不要做用A語言代碼直接呼叫B語言代碼庫這樣復雜、這樣容易出錯的傻事。
只需讓A、B語言代碼的輸入輸出重定向到文本檔案,或修改A、B語言代碼讓其通過文本檔案輸入輸出。
即可很方便地讓A、B兩種語言之間協調作業。
比如:
A將請求資料寫到檔案a.txt,寫完后改名為aa.txt
B發現aa.txt存在時,讀取其內容,呼叫相應功能,將結果寫到檔案b.txt,寫完后洗掉aa.txt,改名為bb.txt
A發現bb.txt存在時,讀取其內容,讀完后洗掉bb.txt
以上A可以替換為任何一種開發語言或開發環境,B可以替換為任何一種與A不同的開發語言或開發環境。
除非A或B不支持判斷檔案是否存在、檔案讀寫和檔案更名。
但是誰又能舉出不支持判斷檔案是否存在、檔案讀寫和檔案更名的開發語言或開發環境呢?
uj5u.com熱心網友回復:
DLLMAIN函式的引數,回傳值都必須為 long 型別另外,自定義的匯出函式如果給其他語言呼叫,引數,回傳值都最好用long型,還有最好都用byval,你的代碼其他問題不大
uj5u.com熱心網友回復:
要說你們這老師也夠奇葩的,怎么能出這種題目這種違反正常使用功能的方法,個人認為不應該出現在教學中,或不應重點應用,點到即可
uj5u.com熱心網友回復:
有進步了,謝謝各位。uj5u.com熱心網友回復:
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/108080.html
標籤:API
