2008-09-02 26 views
2

Yazdığım, C/C++ ile yazılmış bir Windows DLLüm var (tüm dışa aktarılan işlevler 'C'). DLL, VC++ için iyi çalışıyor. DLL'yi tüm geliştirmelerini VB'de yapan başka bir şirkete verdim. İşlevlere bağlanan bir problem yaşıyor gibi görünüyorlar. On yıl içinde VB kullanmadım ve hatta kurmuyorum bile. Sorun ne olabilir?VB6'dan DLL işlevlerini çağırma

#define MYDCC_API __declspec(dllexport) 


MYDCCL_API unsigned long MYDCC_GetVer(void); 
. 
. 
. 

Herhangi fikir şu şekildedir:

Ben bütün kamu işlevlerini ilan ettik?


Sonunda bugün buna geri döndüm ve çalışmasını sağlayın. cevaplar doğru yolda beni koy ama bu en yararlı bulundu:

http://www.flipcode.com/archives/Interfacing_Visual_Basic_And_C.shtml

:

http://www.codeproject.com/KB/DLL/XDllPt2.aspx

Ayrıca, DLL işlevlerine dizeleri geçen birkaç sorun, bu yararlı buldu vardı ihracat için __declspec kullanarak

cevap

4


, işlev adı yani C yardımcı tip bilgileri bulunduğu parçalanmış ihraç alacak ++ derlemek r aşırı yüklemeleri çözer.

VB6, mandallı isimleri kullanamaz. Bir geçici çözüm olarak, isimleri dağıtmak zorundasınız. En kolay çözüm, DLL dosyasını VC++ 'da export definition dosyasını kullanarak bağlamaktır. ihracat tanım dosyası çok basittir ve sadece DLL adını ve verilen işlevlerin bir listesini içerir:

LIBRARY mylibname 
EXPORTS 
    myfirstfunction 
    secondfunction 

Ayrıca, bu VB6 işleyebilir tek çağrı kuralı çünkü stdcall çağırma kuralını belirtmek gerekir. C çağrılarını işlemek için derleme enjeksiyonu kullanan bir proje var ama sanırım bu zor ve hataya eğilimli yöntemi kullanmak istemiyorsunuz. Sonunda

#define MYDCC_API __declspec(dllexport) __stdcall 

Bizim eski VB6 uygulamalar ile etkileşim sonucunda C++ DLL dosyaları var ve hepsi sonunda buna sahip de __stdcall ekleyerek

0

VB6 DLL her zaman bir COM dll'dir. Mümkün olduğunca az kelime ile bir örnek tarif etmeliyim. Varsayalım Eğer As String

Public Function vbConcat (ByVal bir As String, String ByVal b) aşağıda gösterildiği gibi bir yöntem içerir CTest adında bir sınıf ile VB6 bir ActiveX DLL projesi var vbConcat bir & b End Function =

ve size F gibi projeyi derledik VB6 proje özelliklerinde VBTestLib olarak proje adını koyan ve: \ proj \ VB6 \ ActiveXDLL \ VBTestDLL.dll

Windows'u kullanarak dll kaydetmeniz gerekir regsvr32 F: \ proj \ VB6 \ ActiveXDLL \ VBTestDLL komutunu verin.

şimdi

sizin C dll ++ kodu:

#import "F: \ proj \ VB6 \ ActiveXDLL \ VBTestDLL.dll" VBTestLib ad kullanarak; , Ona orada hepsi

geçersiz CDialogTestDlg :: OnButton1() {

HRESULT hresult; 
CLSID clsid; 
_CTest *t; // a pointer to the CTest object 
_bstr_t bstrA = L"hello"; 
_bstr_t bstrB = L" world"; 
_bstr_t bstrR; 
::CoInitialize(NULL); 
    hresult=CLSIDFromProgID(OLESTR("VBTestLib.CTest"), &clsid); 
    hresult= CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER, 
           __uuidof(_CTest),(LPVOID*) &t); 
    if(hresult == S_OK) 
    { 
    bstrR = t->vbConcat(bstrA , bstrB); 
    AfxMessageBox((char*)bstrR); 
    } 

}

kapalı başlamak için.

+1

Bunu geri aldınız. Soru C++ 'dan ihracat ve VB6'ya ithal edildi. –

İlgili konular