使用DLL 返回自身路径遇到的问题 ( 积分: 100 )

  • 主题发起人 主题发起人 穿红衣服的小黄
  • 开始时间 开始时间
穿

穿红衣服的小黄

Unregistered / Unconfirmed
GUEST, unregistred user!
写了一个 dll 用来返回自身路径 dllname为 dynadll.dll 代码如下
function GETDPATH : Pchar ; stdcall
var
path:STRING;
n,j:integer;

begin
{
path:= GetModuleName(HInstance);
j:=length(path);

while(pos('/',path)<>0) do
begin
n:=pos('/',path);
delete(path,1,n)
end;
n:=length(path); //获取 dll 文件名长度

path:=GetModuleName(HInstance);
path:=copy(path,1,j-n) ; //截取路径
result:=pchar(path);
} // 方式1 不代dllname
result:=pchar(GetModuleName(HInstance)); // 方式2 带dllname
end;

然后写了个 exe 去调用他

function GETDPATH():pchar;stdcall
external 'dynadll'
procedure TForm1.Button1Click(Sender: TObject);
begin
edit1.Text:= getdpath;
end;

不管我的返回值是路径 还是路径+dllname 当返回值长度为17左右时,老是不正确显示
如 dll在 使用方式1 目录为 D:/gd_yc/SRC/work D:/浪潮/demo/work F:/1234567890/123 等等时
不代dllname的 返回结果应该是 如 D:/gd_yc/SRC/work/ 这个样子
实际返回给我的是 D:/gd_yc/SRC/wor_ D:/浪潮/demo/wor_ F:/1234567890/12_
_ 标示空格
使用方式2 目录F:/123 返回结果应该是F:/123/dynadll.dll 实际返回是F:/123/dynadll.d_
为什么会这样呢? 希望各位达人告诉我一下
谢谢
 
楼主,如果不带DLL名,你可用extractfilepath就可以了,怎么还自己写一堆东西分析啊?
代码如下
function getpath: Pchar; stdcall;
begin
result := pchar(extractfilepath(GetModuleName(HInstance)));
end;

exports
getpath;

使用时申明如下:
function getpath: Pchar; stdcall; external 'testdll.dll';
 
现在遇到的问题主要是 遇到 上述所说的目录, 返回的值 就不对了啊
具体是什么原因呢?少了字符啊
String with a byte counter (the first byte indicates the length; max. length = 255 characters)
再一个,各位知道 这个类型的参数应该用什么类型的返回值吗? 我想换个返回类型看看
 
不应该当使用pchar作为返回值,尤其在dll中,会给数据交换带来很多麻烦。
你的方法应该事先给 result分配可以存放的足够空间才可以复制,不过这样仍然存在问题,那就是由谁来释放这个空间的问题,否则就是内存泄露。

标准的做法是谁调用,谁分配空间,谁释放空间。给你个例子。
dll部分:
procedure GETDPATH(Ret: PChar); stdcall
begin
StrPCopy(Ret, ExtractFilePath(GetModuleName(HInstance))); // 方式1 不代dllname
StrPCopy(Ret, GetModuleName(HInstance)); // 方式2 带dllname
end;

exports
GETDPATH;

调用实例:
procedure GETDPATH(ret: Pchar); stdcall external 'dynadll'

procedure TForm1.Button1Click(Sender: TObject);
var
s: string;
begin
setlength(s, 255);
GETDPATH(PCHAR(s));
edit1.Text := S;
setlength(s,0);
end;
 
刚才大概测试了一下,可能是内存分配长度的问题。如下写就没问题了。
function getpath: Pchar; stdcall;
var
path: string;
buffer: array[0..1024 - 1] of char;
begin
path := extractfilepath(GetModuleName(HInstance));
strpcopy(buffer,path) ;
result := buffer;
end;
 
返回结果应该是F:/123/dynadll.dll 实际返回是F:/123/dynadll.d_
这是因为你没有单独分配内存,返回值覆盖了未知内存,结尾符变成了随机值。
 
多人接受答案了。
 
后退
顶部