起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 230|回复: 10

【结贴】[请求](急)关于导入非控件DLL无法使用的问题**

[复制链接]
发表于 2009-3-31 16:15:52 | 显示全部楼层 |阅读模式
我把CreateProcess封装进DLL中打算导入X3平台调用,但是在引用过程中报错:
var
lCmdLine: string;
lCmdLine := 'D:\rartemp\winrar.exe a -r D:\rartemp\供应商\test.rar D:\rartemp\供应商\720D967116444FBCBE31446F01EEC9FC\';
RarP.CreateRarP.RarProcess(lCmdLine); // 引用报错

错误信息:
Access violation at address 00000000. Read of address 00000000
类型: EAccessViolation

X3最新版导入第三方控件的文档看了N遍了,中间过程没有什么错误,就是引用执行不行,烦请查看一下,谢谢.

以下是所有相关的DLL工程文件:

所有相关的文件.rar

325.4 KB, 下载次数: 52

回复

使用道具 举报

发表于 2009-3-31 16:20:56 | 显示全部楼层
你先用delphi调用你的dll试试。
回复 支持 反对

使用道具 举报

发表于 2009-3-31 16:22:34 | 显示全部楼层
你写复杂了,根本不用写dll,直接把你写CreateProcess的函数pas导入平台就行了。
我这里没delphi,这东西还试验不了。看异常是引用了什么空的东西。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-3-31 16:26:53 | 显示全部楼层
系统提供的那个Borland.Delphi.Windows.CreateProcess用不了,所以我才重新封装了一层dll,我封装的那个dll验证没有问题的,能正常执行压缩
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-3-31 16:33:46 | 显示全部楼层
我的版本是2827的,搞了一整天了,还不是没成,
另: 直接导入函数pas怎么导?
回复 支持 反对

使用道具 举报

发表于 2009-3-31 16:41:02 | 显示全部楼层
跟平台版本没关系。  
直接把你写CreateProcess的函数pas导入平台就行了。就当做接口文件那个pas一样处理。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-3-31 16:58:55 | 显示全部楼层
换成pas直接导入,但是还是有报错:
Access violation at address 01A8E0F2 in module 'rtdbg.dll'. Read of address 00000000
回复 支持 反对

使用道具 举报

发表于 2009-3-31 17:05:36 | 显示全部楼层
你在你写CreateProcess的函数里面加上调试信息,看看到哪一步报的错误。如何报的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-3-31 17:25:23 | 显示全部楼层
晕倒啊,现在运行后直接关闭business.exe,天啊,我这个这么简单的函数,我实在看不出是那里错...
unit CreateRarP;

interface

uses  SysUtils, Classes, Windows;

function RarProcess(ACmdLine :string): Boolean;stdcall;

implementation

function RarProcess(ACmdLine :string):Boolean;stdcall;
var
    StartupInfo : TStartupInfo;
    ProcessInfo : TProcessInformation;
begin
    FillChar(StartUpInfo, SizeOf(StartUpInfo), 00);
    StartupInfo.cb:=SizeOf(StartupInfo);
    StartupInfo.dwFlags:=STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
    StartupInfo.wShowWindow := SW_HIDE;

    if not CreateProcess(nil,PChar(ACmdLine),nil,nil,False,
       CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,
       nil,nil, StartupInfo, ProcessInfo) then
    begin
        Result := false;
        exit;
    end;

    WaitForSingleObject(ProcessInfo.hProcess, INFINITE);

    CloseHandle(ProcessInfo.hProcess);
    CloseHandle(ProcessInfo.hThread);
    Result := true;
end;

end.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-4-1 08:54:38 | 显示全部楼层
用pas导入的方式已经解决,后面的报错是因为在写配置文件ipr的时候,输出文件名忘记加.dll后缀的原因.
但是封装成DLL后再导入则一直没有成功,不知什么原因,不过已经有pas方式解决,可以结贴了,谢谢
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-23 02:58 , Processed in 0.042506 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表