题
我已经有了一个窗DLL我写的,编写的C/C++(所有出口的功能是'C')。DLL工作的现我在VC++.我已经给DLL到另一家公司谁做的他们所有的发展中VB。他们似乎是有问题的链接的功能。我没有用VB在十年,我甚至没有安装。可能是什么问题吗?
我已经声明我所有的公共职能如下:
#define MYDCC_API __declspec(dllexport)
MYDCCL_API unsigned long MYDCC_GetVer( void);
.
.
.
任何想法?
终于得到了回到这个今天有它的工作。答案把我放在正确的轨道,但我找到这个最有帮助:
http://www.codeproject.com/KB/DLL/XDllPt2.aspx
此外,我有几个问题通过串DLL的功能,我发现这有帮助:
http://www.flipcode.com/archives/Interfacing_Visual_Basic_And_C.shtml
解决方案
通过使用 __declspec
对于出口,名称的功能将得到出口 错位, 即含有类型的信息,以帮助C++编译器解决过载。
维生素b6无法处理的损坏名。作为一种解决办法,你必须去损坏的名称。最简单的解决方案是链接DLL文件的使用 出口定义 文件在VC++.出口定义的文件是非常简单,只是包含的名称DLL和列表的出口功能:
LIBRARY mylibname
EXPORTS
myfirstfunction
secondfunction
此外,必须指定 stdcall
呼吁《公约》,因为这是唯一的呼吁《公约》的维生素b6可以处理。有一个项目,利用大会注射处理C电话但我想你不想要使用这个艰难和容易出错的方法。
其他提示
尝试增加__的末端
#define MYDCC_API __declspec(dllexport) __stdcall
我们有一些用C++dll互动与我们的旧应用程序的维生素b6他们都有那在末端。
一个维生素b6DLL始终是一个COM dll。我将描述一个示例,因为几句话,作为可能。假设有一件DLL项目中的维生素b6有一类称为CTest其中包含的方法如下所示
公共职能vbConcat(果你正在调试一如串,果你正在调试b As String)As String vbConcat=a&b 结束功能
和你已经设置的项目名称为VBTestLib在维生素b6项目的性质和 你已经编制了项目F:\proj\VB6\ActiveXDLL\VBTestDLL.dll
你需要注册dll使用的Windows的命令 regsvr32F:\proj\VB6\ActiveXDLL\VBTestDLL.dll
现在你C++编码:
#进口"F:\proj\VB6\ActiveXDLL\VBTestDLL.dll" 使用的名称空间VBTestLib;
void 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);
}
}
就是它,开始关闭。