C++Builder怎样调用C#作的DLL啊?
最好能给一个例子. 问题点数:50、回复次数:13Top
1 楼COKING(天晴)回复于 2003-09-02 09:08:29 得分 0
你你你?Top
2 楼WYJBCB(阿菜)回复于 2003-09-02 09:38:53 得分 0
楼上的兄台,不知何意?Top
3 楼Iamsnowgirl(snowgirl)回复于 2003-09-02 11:18:51 得分 6
动态连接库(dll)的调用主要有两种方式:隐式链接和显式链接。隐式
链接是常用方式。
如果应用程序和动态库是分别在不同开发平台上编制的,动态库的导入
库(lib文件)可能会与应用程序的开发平台所要求的导入库格式不相容,从而在应用程序与动态库隐式链接时,出现程序链接错误:contains invalid OMF record。例如在C++Builder开发平台上链接Visual C++制作的动态库时,就会出现上述的错误。解决这一问题,可以采用两种方法:显式连接法和使用C++Builder中提供的导入库生成工具。
显式连接:显式连接不需要在工程中加入导入库和相应的头文件,只需要把动态库放入指定的目录下。在应用程序中通过函数调用显式的装载和卸掉DLL,通过函数指针来调用DLL的导出函数。
步骤:
1. 调用LoadLibrary函数装载DLL并得到模块句柄;
2. 调用GetProcAddress函数获取指定导出函数的指针;
3. 用这个函数的指针调用该函数;
4. 使用完毕后,用FreeLibrary释放DLL。
例子:
用VC++制作一个动态库:
选new→Project→Win32—Dynamic—Link Library,加入addit.cpp
extern ″C″
{ void —declspec( dllexport ) addit(int a, int b, int *c)
{ *c = a + b;
}
}
addit.h
extern ″C″
{void addit(int a, int b, int *c);}
编译链接生成addit.dll和addit.lib。在C++Builder程序中调用addit函数。
C++Builder程序中:
{HINSTANCE handle; //DLLa模块的句柄
FARPROC lpFarProc;
void (*lpaddit)(int,int,int *);
//指向addit函数的指针
int ntemp;
handle = LoadLibrary(″addit.dll″);
//装载addit.dll, 得到该库句柄
//addit.dll位于当前目录下
lpFarProc = GetProcAddress(handle,″addit″);
//得到指向函数addit的指针
lpaddit = (void(—cdecl *)(int, int, int *))lpFarProc; //指针类型转换
lpaddit(2,3,&ntemp); //使用addit函数
FreeLibrary(handle);
//将addit.dll从程序中卸掉
}
此程序在VC++ 5.0 和C++Builder 3.0下通过。
使用C++Builder中提供的导入库生成工具:先预处理,后隐式链接。
步骤:
1.用C++Builder提供的implib.exe工具重新生成该动态库(xxx.dll)的导入库(xxx.lib)。命令如下:
implib addit.lib addit.dll。
addit.dll为已有动态库,addit.lib为要生成的导入库。由此生成的导入库addit.lib格式与C++Builder开发平台是相容的;
2.在动态库的头文件addit.h中,对其输出函数重新说明,语句如下:
extern —stdcall void addit( int a, int b, int *c);
3.然后采用隐式链接法,将重新生成的导入库(addit.lib)和重新说明的头文件(addit.h)加入到C++Builder应用程序的工程项目中,进行编译和连接。
addit.dll按上述步骤操作,在VC++ 5.0 和C++Builder 3.0下通过。
Top
4 楼WYJBCB(阿菜)回复于 2003-09-02 11:30:56 得分 0
To Iamsnowgirl(snowgirl)
谢谢,不过这篇文章我也有,他对C#的调用好像不行.Top
5 楼yhz(耗子)回复于 2003-09-02 20:13:48 得分 6
不要随便用C#写DLL。
因为它生成的是托管代码。要装.net freamework(是这么写的吧?)
用 VC.net 写 DLL 的时候,还是选择静态 MFC DLL,比较好。
如果你确认你的调用没有问题,我想很可能是这个问题。Top
6 楼zjqyb(风清扬*任它溺水三千,我只取一瓢饮*)回复于 2003-09-02 20:33:24 得分 6
要C++Builder7.0以上才能
调用C#作的DLLTop
7 楼ThinkX(秋天的树)回复于 2003-09-02 20:56:31 得分 6
我想也许你可以用VC.NET包装一下,不过无论如何你的程序都脱不开.NET FrameworkTop
8 楼Behard(我爱天安门)回复于 2003-09-03 09:11:01 得分 3
没有 VC.net 没有权利发言Top
9 楼hongliqiu(在火中)回复于 2003-09-05 09:40:11 得分 3
不知道,听课来了。Top
10 楼wenyongjie(我们的目标是:没有蛀牙!!)回复于 2003-09-05 09:55:10 得分 0
我作了一下,没有成功,现把代码帖出,各位看下有哪些要改一下!
这是C#的DLL
using System;
namespace CBDLL
{
/// <summary>
/// Class1 的摘要说明。
/// </summary>
public class Class1
{
public Class1()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public string test(string str)
{
return(str);
}
}
}
CB 动态调用
private: // User declarations
String (__stdcall *test)(String str);//声明
void __fastcall TForm1::Button1Click(TObject *Sender)//双击Button1调用
{ HINSTANCE DLLInst = NULL;
String s;
if( NULL == DLLInst ) DLLInst = LoadLibrary("CBDLL.dll"); //上面的 Dll
if (DLLInst) {
test=(String (__stdcall*)(String str)) GetProcAddress(DLLInst,"_test@0");
if (test)
{ s=test(Edit1->Text); ShowMessage(s); }
else ShowMessage("不能取得函数test指针");
}
else ShowMessage("加载CBDLL.dll错误!");
FreeLibrary(DLLInst);
}
出现如下提示: 不能取得函数test指针Top
11 楼yhz(耗子)回复于 2003-09-28 15:54:18 得分 6
你用 depends 去检查一下你的 test 的名字还是不是 test ???
我现在手头上没有 VC.net,不过我估计在编译的时候,编译器把输出名字改了。
或者你在 DLL 的输出函数里面加上 __stdcall 试试看?Top
12 楼zhouzhouzhou(人生程序)回复于 2003-09-28 16:23:10 得分 3
不是吧,
暈Top
13 楼storm97(风暴不再)回复于 2003-09-28 18:37:32 得分 11
http://www.csdn.net/develop/article/21/21259.shtmTop




