delphi调用vc的dll问题 ( 积分: 100 )

  • 主题发起人 主题发起人 linmang
  • 开始时间 开始时间
L

linmang

Unregistered / Unconfirmed
GUEST, unregistred user!
输出函数是这样的:
_declspec(dllexport) int exp_d(const char* cipher, unsigned long* id, char memo[5])
大致意思是第一个输入字符串,后面两个是返回值。
调用时声明如下:
function exp_d(var cipher:pchar;var id:pdword;var memo:array of char):integer;stdcall;external 'dll.dll';

程序中:
var str:string;
id:pdword;
memo:array[0..4] of char;
begin
....
exp_d(pchar(str),id,memo);
...
//然后输出:
memo1.line.add('id '+pchar(id));
...
end;
程序编译没有问题,运行时的输入却总是空的 ,哪位看看这个代码有什么问题,实际的输出不应该是空的,有具体的值。dll在vc中调用是没有问题的。
 
输出函数是这样的:
_declspec(dllexport) int exp_d(const char* cipher, unsigned long* id, char memo[5])
大致意思是第一个输入字符串,后面两个是返回值。
调用时声明如下:
function exp_d(var cipher:pchar;var id:pdword;var memo:array of char):integer;stdcall;external 'dll.dll';

程序中:
var str:string;
id:pdword;
memo:array[0..4] of char;
begin
....
exp_d(pchar(str),id,memo);
...
//然后输出:
memo1.line.add('id '+pchar(id));
...
end;
程序编译没有问题,运行时的输入却总是空的 ,哪位看看这个代码有什么问题,实际的输出不应该是空的,有具体的值。dll在vc中调用是没有问题的。
 
extern "C&quot
_declspec(dllexport) int exp_d(const char* cipher, unsigned long* id, char memo[5])

把输出函数改为上面形式试试!
 
问题是我改不了,这个是别人做的,我只能用。:(
 
cdecl而不是stdcall
 
stdcall改成cdecl得到的结果是一样的,都是控制,我看了,都是nil
 
1、function exp_d(var cipher:pchar;var id:pdword;var memo:array of char):integer;stdcall;external 'dll.dll'

function exp_d(cipher:pchar;var id:pdword;var memo:array of char):integer;stdcall;external 'dll.dll';

2、cipher是PChar,定义是var pstr:array [0..??] of char而不是var str:string;
string是什么,多长???只有特定的开发环境知道。
 
//然后输出:
memo1.line.add('id '+pchar(id));
========================================
id是什么呀???,字符串ID号??看不太懂,字符串应该在cipher里吧
 
function exp_d(var cipher:pchar...
去掉var后,编译没问题,运行时报出:access violation at ..in module 'msvcrt.dll', write...
 
第二点改了吗?原形是const char* cipher,const呀,var不就变了???
 
function exp_d(cipher : PChar
var id : DWORD
memo : PChar) : integer
cdecl/stdcall
extern "__DLL.dll";
1.不要随便就var,
2.调用方式可以根据堆栈来判定(观察Call指令前后的堆栈指针ESP,如果没有变化,应该是cdecl,否则应该是stdcall(基本上除此之外的调用方式很少见)),也可以通过调试.你可以用PEEXPLORER反汇编exp_d,找到他的ret的汇编指令,如果就是简单的ret/retn那么就是cdecl,如果是 ret 0x0C,那么就应该是stdcall了.
 
如果cipher是输入那么可以定义var str:string,如果输出,那就是var str:array [0..??] of char,不过看样子不象输出,因为原形是const char* cipher。
 
to cyradg 第二项也改了,返回还是空
pstr: array [0..100] of char;
..赋值...
调用不变
 
function exp_d(var cipher:pchar;var id:pdword;var memo:array of char):integer;stdcall;external 'dll.dll';
======================================================
还是介绍一下三个参数吧,
1、var肯定不要
2、不清楚,(1)赋予id一个DWORD值,那么var id:DWORD;(2)赋予id一个数据指针,那么id:PDWORD,不要var
3、memo是干什么的??
 
to cyradg:memo只是一个返回的字符串,其实用不到,只要完整这个函数就可以了。id值的你说的两种写法我都试了,结果输出都是空的,:(
 
//来自:cyradg, 时间:2005-9-19 16:51:53, ID:3210816
//var id:DWORD || id:PDWORD
这两者在代码层面没有什么区别.
如果是赋予一个PDWORD的指针出来,那么应该是var id : PDWORD才对.
 
运行时报出:access violation at ..in module 'msvcrt.dll', write...
 
不太懂
帮你顶一下
 
PChar(id)??好象是字符串,另外var id:DWORD和id:PDWORD是有区别的,当然如果是赋予ID一个DWORD值,那么没区别,如果是赋予一个缓冲数据,那么就不一样了,后者必须必须先分配缓冲,如id:array [0..100] of byte;exp_d(..,PDWORD(@id),..),另外cipher是可以输出内容的,上面说错了,只是cipher指针数据不能改,如:
const char* tt;
char *yy;
*tt=*yy;//错误,不能改变const
tt="LKJ";//正确
我不清楚id是干什么的,如果是字符串缓冲,为什么用unsigned long*
 
说实话,我比你还奇怪啊,为什么要这么麻烦的输出,肯定没有考虑其它程序的调用。奇怪输出的值总是nil,我再尝试多种方式,试试。多谢各位,希望继续关注这个问题。
 
后退
顶部