急求: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)
...全文
348 13 打赏 收藏 举报
写回复
13 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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);
.............
  • 打赏
  • 举报
回复
相关推荐
最新单片机仿真 独立式键盘调数码钟实验 最新单片机仿真 独立式键盘调数码钟实验最新单片机仿真 独立式键盘调数码钟实验最新单片机仿真 独立式键盘调数码钟实验最新单片机仿真 独立式键盘调数码钟实验最新单片机仿真 独立式键盘调数码钟实验最新单片机仿真 独立式键盘调数码钟实验最新单片机仿真 独立式键盘调数码钟实验最新单片机仿真 独立式键盘调数码钟实验最新单片机仿真 独立式键盘调数码钟实验最新单片机仿真 独立式键盘调数码钟实验最新单片机仿真 独立式键盘调数码钟实验最新单片机仿真 独立式键盘调数码钟实验最新单片机仿真 独立式键盘调数码钟实验最新单片机仿真 独立式键盘调数码钟实验最新单片机仿真 独立式键盘调数码钟实验最新单片机仿真 独立式键盘调数码钟实验最新单片机仿真 独立式键盘调数码钟实验最新单片机仿真 独立式键盘调数码钟实验最新单片机仿真 独立式键盘调数码钟实验最新单片机仿真 独立式键盘调数码钟实验最新单片机仿真 独立式键盘调数码钟实验最新单片机仿真 独立式键盘调数码钟实验最新单片机仿真 独立式键盘调
发帖
其他开发语言
加入

3394

社区成员

其他开发语言 其他开发语言
申请成为版主
帖子事件
创建了帖子
2004-09-04 09:14
社区公告
暂无公告