急求:InstallShield8中,调用VC的DLL时出错

Ascn 2004-09-04 09:14:19
我以VC6做了一个DLL,文件名:JsSec.dll,在InstallShield8中调用。
DLL中有两个函数:
char* GetSrcText();
char* MDString(char* str);

在PB9中调用成功,正常使用。VC自身的测试程序也能正常使用。

在IS8中声明如下:
prototype cdecl STRING JsSec.GetSrcText();
prototype cdecl STRING JsSec.MDString(BYREF STRING);
//主要是第二个不成功,我还试过prototype cdecl STRING JsSec.MDString(POINTER);

但是在执行安装时,第一个函数调用成功,返回了正确的字符串。
第二个函数却出现问题,提示:

错误号码:0x80040704
说明:Dll函数调用导致错误的堆栈 原型可能不正确:JsSec.MDString
安装程序将立即终止。
(可以参见:http://www.lovephp.com/temp/iserr.jpg)
...全文
376 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ascn 2004-11-10
  • 打赏
  • 举报
回复
晕,怎么好象给不了分呢?
VbKing 2004-11-01
  • 打赏
  • 举报
回复
VB的用CreateObject来处理就可以了。
解大劦 2004-10-28
  • 打赏
  • 举报
回复
考,我也出现同样的问题了,不知道如何解决.我的dll是vb写的.
Ascn 2004-10-14
  • 打赏
  • 举报
回复
呵呵,再来看看。过几天结帐:)
Ascn 2004-09-28
  • 打赏
  • 举报
回复
怎么没人来看了吗?
Up
Ascn 2004-09-13
  • 打赏
  • 举报
回复
两种声明我都用过了。都不行
我知道在IS中声明原型时只需要参数的类型,我的意思是只要是带参数的函数就无法正常使用。嗯,就是说,如果是 ReturnType Func() 就行,但 ReturnType Func(ArgType) 就不行了。

MDString函数是将参数字符串进行MD5变换,然后返回变换后的字符串。(汗,我一直习惯性地叫成MD5加密)

喝醉的咖啡 2004-09-12
  • 打赏
  • 举报
回复
你声明的是“原型”,当然不需要参数了 :)

你用的究竟是
prototype cdecl STRING JsSec.MDString(BYREF STRING);
还是
prototype cdecl STRING JsSec.MDString(STRING);

后者才符合你在 VC 里 export 的参数类型。

对了, MDString 返回一个 string 是用来做什么的呢?


try try 看看,好久没写 dll,实在是没用is调过这玩意儿,mIRC Script 倒是经常这么用,呵呵

btw, MD5 不是一个加密算法

_____________________
piggybank
http://www.xiaozhu.com
Ascn 2004-09-11
  • 打赏
  • 举报
回复
感谢。
我知道那个方法,调用DLL函数有两种方法,一种是上述CallDLLFx,还有一个是直接声明外部函数,如我的方法。其中要用到UseDLL和UnUseDLL。

我那个方法中,如果声明有参数,调用就不会成功,只有当无参数时,才会正常使用。不知为何。

我已换了一种方法,不调用那个函数,直接在IS脚本中对一串字符进行变换,而不用VC的函数来进行MD5加密。没办法了。在我空闲一些时,再改用CallDLLFx来试试。呵呵

希望有高人指点直接声明外部函数那种方法的正确用法,如何能使得有参数的函数也能正常使用。因为那个CallDLLFx的函数参数只能传递那两个(不太会用指针,汗)
fridayeve 2004-09-08
  • 打赏
  • 举报
回复
我也是用的8.0,调用vc所做的dll我用了CallDLLFx,没见到你用啊。
根据帮助CallDLLFx ( szDLL, szFunction, lvValue, svValue ),后两个参数一个是long,一个是string,不知道为什么要这样,实际上我的dll函数中用不着这两个参数,但为了符合它的结构,也给加上去了。也就是说在VC中导出的函数中须有这两个参数,我用的是(LPLONG lpIValue, LPSTR lpszValue),就算用不着,也得做个摆设,我是这样做的,没有尝试过别的方法,不知你有没有按照它的格式要求去做。
说得有点乱。
Ascn 2004-09-05
  • 打赏
  • 举报
回复
顶上去,在线等待........
jiangchuandong 2004-09-04
  • 打赏
  • 举报
回复
晕,不懂vc
Ascn 2004-09-04
  • 打赏
  • 举报
回复
补充一下:
VC中函数声明:
char* PASCAL EXPORT GetSrcText();
char* PASCAL EXPORT MDString(char* str);
在.def文件中设置输出这两个函数。
函数MDString的返回字符有32位(其实就是MD5加密后输出的结果啦)

我用在DLL中加入AfxMessageBox这种笨办法得知,IS脚本在运行时调用了这个函数,并且
在返回前都还是正常的。但一旦返回IS中就出错了。
调试IS脚本时,直到调用该函数前,svSSS正常,ps为一个较大的正整数,一旦调用,则
无法继续跟踪了:(

急盼各位大大伸手拉兄弟一把,如果分不够,回贴说一声就行。
Ascn 2004-09-04
  • 打赏
  • 举报
回复

贴段代码,望指教,谢谢:
// your DLL function prototypes
prototype cdecl STRING JsSec.GetSrcText();
prototype cdecl STRING JsSec.MDString(STRING);


// ---- script function prototypes -----


// your script function prototypes
prototype STRING SetKey();
prototype STRING GetKey();

// your global variables
BOOL gbCheckKey;
STRING szDllName, svSSS;

////////////////////////////////
......
////////////////////////////////
Dlg_SdWelcome:
szTitle = "";
szMsg = "";
nResult = SdWelcome( szTitle, szMsg );
if (nResult = BACK) goto Dlg_Start;

// szDllName = SUPPORTDIR ^ "JsSec.dll";
szDllName = "D:\\Apps\\JsSec.dll";
UseDLL(szDllName);

svSrc = SetKey();
svSSS = svSrc;
MessageBox(svSrc, INFORMATION);
szPass = GetKey();
szTitle = "序列号检测";
szMsg = "请将下面显示的字符串(12位)记下并告知软件供应商,";
szMsg = szMsg + "然后将得到的序列号填写在下方的输入框中。\n\n" + svSrc;

Dlg_CheckKey:
nResult = SdShowDlgEdit1(szTitle, szMsg, "序列号: ", svKey);
if (nResult = BACK) goto Dlg_SdWelcome;
if (svKey != szPass) then
gbCheckKey = FALSE;
szMsg = "非法的序列号!请将提示的12位数字告知软件供应商,";
szMsg = szMsg + "然后将从供应商处得到的序列号填写在“序列号";
szMsg = szMsg + "”输入框中并点击“下一步”继续。\n\n这12位";
szMsg = szMsg + "字符为:\n" + svSrc;
MessageBox(szMsg, WARNING);
goto Dlg_CheckKey;
else
gbCheckKey = TRUE;
endif;

UnUseDLL(szDllName);

if (gbCheckKey = FALSE) then
abort;
endif;
////////////////////////////////
......
////////////////////////////////
// 函数 GetKey() 能够正确返回一个字符串(12位数字)到全局变量svSSS中。
///////////////////////////////////////////////////////////////////////////////
function STRING GetKey()
// To Do: Declare local variables.
STRING ls_aa, ls_bb, ls_tmp;
NUMBER ll_for, ll_count, parm_int;
POINTER ps;
begin

// To Do: Write script that will be executed when MyFunction is called.
if (svSSS = "") then
return "";
endif;

ps = &svSSS;
MDString(svSSS); // 当用指针ps时,仍然出现同样错误:(
MessageBox(svSSS, INFORMATION);
.............

3,424

社区成员

发帖
与我相关
我的任务
社区描述
其他开发语言 其他开发语言
社区管理员
  • 其他开发语言社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧