我先说说我的思路。错误的地方帮忙指点。
要实现的功能:delphi7要调用vc写的dll,dll中参数类型为char**。
dll中的声明:
extern "C" _declspec(dllexport) char* __stdcall ML_I(char** arrGroupNo,char** arrMedialpm)
{
CString strIP1=arrGroupNo[0];
CString strIP2=arrGroupNo[1];
CString strIP3=arrMedialpm[0];
}调用此函数时应传递指针数组。
所以在delphi中声明参数类型为:array of PChar//PChar类型为指针,是指向0结尾的字符串。
贴点代码:
arrGroupNo:array[0..1] of PChar;
arrMedialpm:array[0..1] of PChar;arrGroupNo[0]:='101.1.110.1'+char(0);
arrGroupNo[1]:='101.1.110.2'+char(0);
arrMedialpm[0]:='101.1.110.136'+char(0);
arrMedialpa[0]:='101.1.110.137'+char(0);问题:
测试dll时,strIP1,strIP正确。strIP3报错:访问错误。
要实现的功能:delphi7要调用vc写的dll,dll中参数类型为char**。
dll中的声明:
extern "C" _declspec(dllexport) char* __stdcall ML_I(char** arrGroupNo,char** arrMedialpm)
{
CString strIP1=arrGroupNo[0];
CString strIP2=arrGroupNo[1];
CString strIP3=arrMedialpm[0];
}调用此函数时应传递指针数组。
所以在delphi中声明参数类型为:array of PChar//PChar类型为指针,是指向0结尾的字符串。
贴点代码:
arrGroupNo:array[0..1] of PChar;
arrMedialpm:array[0..1] of PChar;arrGroupNo[0]:='101.1.110.1'+char(0);
arrGroupNo[1]:='101.1.110.2'+char(0);
arrMedialpm[0]:='101.1.110.136'+char(0);
arrMedialpa[0]:='101.1.110.137'+char(0);问题:
测试dll时,strIP1,strIP正确。strIP3报错:访问错误。
解决方案 »
- delphi?
- 调查:石家庄用Delphi的还多吗
- delphi 中文和数字转16进制问题
- QReport中如何放多个DetailBand
- 高手们,在数据模块上能用messagebox吗?怎么老是报错!
- 如何用这个DLL中的函数,关于参数传递的问题
- 200分!up的都有分,怎么下载这样的文件?
- 请问,关于SQL SERVER 中的SUBSTRING函数
- 急啊:谁写一段代码给我,把memo中的词提取出来,放到另一个memo中
- 我想用鼠标钩子在屏幕上画画
- form1的变量如何给form2用?
- 获取网站的数据(wininet,idhttp和winsock什么的)哪种方式最快,有做过类似打水软件的可联系
arrMedialpa[0]:='101.1.110.137'+char(0);
你确定调用ML_I的时候, arrMedialpm还有效吗, 即内存没有有被释放掉.或者你传入的指针是否正确?提示是地址访问错误, 你可以在dll中的 ML_I 函数中输出 指针值看看指针是否合法.
2. char **p=NULL;
p=arrMedialpm; 得到p为0x00000001 应该也是合法的了吧。
还有别的可能吗?
这个你在Delphi里是怎么声明的?
type
PPCharArray = ^TPCharArray;
TPCharArray = array[0..255] of PChar;function ML_I(arrGroupNo, arrMedialpm: PPCharArray): PChar; stdcall external 'MLClient.dll';
TPCharArray = array[0..255] of PChar;
function ML_I(arrGroupNo:PPCharArray;arrMedialpm:PPCharArray;arrMedialpa:
PPCharArray;n:Integer;disk:PChar):PChar; stdcall;external 'MLClient.dll';
arrGroupNo:PPCharArray;//array[0..1] of PChar;
arrMedialpm:PPCharArray;//array[0..1] of PChar;
arrGroupNo[0]:='101.1.110.1'+char(0);
arrGroupNo[1]:='101.1.110.2'+char(0);
arrMedialpm[0]:='101.1.110.136'+char(0);
arrMedialpm[1]:='101.1.110.137'+char(0);
但是调试dll时直接访问错误啊:
arrGroupNo:PPCharArray;//array[0..1] of PChar;
arrMedialpm:PPCharArray;//array[0..1] of PChar;
这两个变量传入之前分配空间了吗?你应该这样使用:
arrGroupNo:TPCharArray;
arrMedialpm:TPCharArray;
ML_I(@arrGroupNo, @arrMedialpm, ...);我测试了一下,按照你给出的C声明写了一个DLL,用Delphi调用是正常的。