delphi调用C++动态库的问题! 急!!!!! 在线等!!!! ( 积分: 200 )

  • 主题发起人 主题发起人 tracylilac
  • 开始时间 开始时间
T

tracylilac

Unregistered / Unconfirmed
GUEST, unregistred user!
有谁用过中兴或是清华深讯的电信短信收发的动态库做二次开发吗?
我用的DLL文件是用C++开发的,说明上说可以移植到DELPHI中,但我调用时不能初始化.还需要做什么准备吗?
 
是不是要把接口文件翻译为PASCAL的?
 
不是,
我用的是C++编写的DLL动态库,我只是想知道,在DELPHI中的调用方法.该DLL文件说明说DELPHI可以调用.
但直接调用不成功,原因大概是什么,是否还需要在调用前做什么准备工作.
 
晕,有开发文档的。
 
开发文档中有的是函数说明,我也不是第一次用DLL了,应用上应该没有问题,
但这次就是不能成功.听说还要对原有C++的动态库进行重新的封装?真的吗?要是不封装的话,DELPHI就不能用吗?
 
看情况,如果这C++是VC++写的,如果这DLL是VC++的扩展DLL类型,也就是有导出类的DLL那就要重新封装,如果都是导出标准的C的DLL那在任何语言下使用都一样!如果是中兴的,我认为人家早考虑到这些问题的,估计也不会用个CString来折腾用户的,估计是你的参数没有传对,估计是你的字符串类型的参数没有传对,检查一下!
 
1、做试验你的delphi编译器是安1位,还是8位编译!这个是万分重要的
2、用vc++ 做个,简单的2+3=5 小.dll,看你的delphi 是否能正常调用!
肯定是能调!如果能调,把你需要的.dll全部函数,做二次封装,
delphi.exe----->my.dll-----> a.dll
b.dll
c.dll
如果还搞不定,求求我吧!
其实delphi写的.dll, c++builde也无法打开,
反过来:c++ 写的,其它语言也无法打开!
.dll 就这个死样子
 
除了 VB写的 ACTIVEX DLL外,其它语言写的 DLL 一般都不存在通用问题,特别是 D 和 C, 不行的话是个人问题。
 
还有函数传参类型 注意看是 __stdcall 还是 __cdecl
 
TO:白河愁
按 C标准封装的都通用的,
TO:www.ynxbs.com
确实,把Delphi改成byte对齐吧,这个是关键,不过如果没有结构体变量是不会出现问题的。
TO:Miros这也是特别注意的。
 
to Dullhe:
上面评论very good!
但是:按 C标准封装的都通用的 ?
怕是大意了,C也没有说杂个封装的是标准的?
 
除了一种情况外,我没有碰见过说什么语言写的动态库到那个语言下用不了的情况,ActiveX就更好使了,估计是文档你没仔细看清除吧。
我支持:"按C标准封装的都通用的"说法,但要注意__stdcall还是别的call方式。
 
没有用过,提前而已!
 
TO:onedolph;
没见过是吧?提示下Delphi写Dll时会出现的情况,你可以测试下:
delphi写dll给vc调用。
告诉你怎么写
不管你用何种调用方式
1.你在dll工程的一个独立的单元中写个类。
2.在你的dll工程的一个独立的公共单元中写个类的变量,接口部分。
3.在你的工程最上引用你的公共接口单元(里面有公共的类变量)。
4.你在你的导出函数中写个能创建该变量的接口函数。
5.用另外接口个函数对该对象变量进行操作。
6.结果发现在delphi下调用,运用全没事,CBuilder下用也没事。
7.你按照这情况用vc或vb去调用吧,试试看。其实你用Delphi写的ActiveX也有同样的情况,你可以测试下,用Delphi写个传array[0..99] of char的变量,也就是字符数组变量,或干脆就是个指针型的变量,你在Delphi和CBuilder都可以用,你到VC或VB试试看。
我说这么多没别的目的,只是说,语言不同,对dll其实是有差别的,我都是按照C那样写,
能怎么做就怎么做,所以,按照我说的情况,在Delphi只能和C一样,虽然C有语句可以直接内存映射,但Delphi或CBuilder写DLL就没有这指令了,但有动态那种,来解决这样的差别问题。大家可以试试看。玩多了!
 
其实我觉着你说了那么多,但说得都不够具体,你不如把你要调用的函数拿出来,然后再说在调用时,是如何出错法,这样大家讨论会比较有针对性一些,要不然,这样说下去,也无非是C与D的互换,这样的讨论是得不出一个好的结果来的。
另外,从你所说的初始话没有成功,我倒想起一个事,你的这个DLL是否是通地串口来调用硬件设备来发送短信的,如果是的话,你要确保你的微机上有串口,且这个串口是不被占用的。
 
楼上讲得有理,把具体的拿出来,大家给你想想具体的办法,不然讲的和大家想的办法都太笼统了
 
to dullhe,
我比较菜,理解能力比较差,不知道我对你的知道理解的对不对:
delphi的动态库单元如下:
library dlltest;

uses
SysUtils,
Classes;

{$R *.res}

type
TMyClass = class
public
value: Integer;
constructor Create;
end;

var
myobj: TMyClass;

constructor TMyClass.Create;
begin
inherited Create;
end;

procedure CreateObj; stdcall;
begin
myobj := TMyClass.Create;
end;

procedure SetValue(V: Integer); stdcall;
begin
myobj.value := v;
end;

function GetValue: Integer; stdcall;
begin
Result := myobj.value;
end;

exports
CreateObj,
SetValue,
GetValue;

begin
end.

vc调用如下(具体全部代码不卸了,只写出关键代码):

typedef void (_stdcall *TCreateObj)();
typedef void (_stdcall *TSetValue)(int v);
typedef int (_stdcall *TGetValue)();

void CVctestDlg::OnButton1()
{
HINSTANCE hdll = LoadLibrary("dlltest.dll");
if(!hdll)
{
MessageBox("load dll error");
return;
}
TCreateObj CreateObj = (TCreateObj)GetProcAddress(hdll, "CreateObj");
if(!hdll)
{
MessageBox("load CreateObj error");
return;
}
TSetValue SetValue = (TSetValue )GetProcAddress(hdll, "SetValue");
if(!hdll)
{
MessageBox("load SetValue error");
return;
}
TGetValue GetValue = (TGetValue)GetProcAddress(hdll, "GetValue");
if(!hdll)
{
MessageBox("load GetValue error");
return;
}
CreateObj();
SetValue(10033);
int r = GetValue();
char buf[10];
sprintf(buf, "%d", r);
MessageBox(buf);
}
我用的是delphi7+vc6,测试结果,啥问题没有!
另外你说的分几个单元写,我觉得没必要,分了也木有啥问题,还是正确。
如果你觉得我写的不符合要求,你可以把你的错误代码贴在这里,或者直接发到我邮箱
我帮你琢磨琢磨,应该没有什么问题的,关键是解决问题。
如果你的ActiveX有问题,也可以一起探讨一下。
 
谢谢大家.我不用他的那个了,用他自己带的例子程序都出问题了.可见.....
还是谢谢大家.希望能与各位热心人交个朋友.呵呵呵:QQ105937356
SORRY,分值有限.请见谅!
 
后退
顶部