目前很奇怪的是,我正在使用VB6作为测试平台,每次在IDE中运行测试时,程序会运行,然后IDE进程突然从内存中消失 - 没有错误消息,什么也没有。如果我逐步执行代码,直到执行最后一行,一切都正常,然后IDE就消失了。
相比之下,当我将测试编译为EXE时,程序会运行到结束,没有错误消息等。
有人遇到过这个问题吗?是否有明显的解决方案摆在我的面前?
以下是源代码,以防有影响:-- 项目
library BOSLAD;
uses
ShareMem,
SysUtils,
Classes,
BOSLADCode in 'BOSLADCode.pas';
exports
version,
DMesg,
foo;
{$R *.res}
begin
end.
-- 单元
unit BOSLADCode;
interface
function version() : Double; stdcall;
procedure DMesg(sText : WideString; sHead : WideString ); stdcall;
function foo() : PWideString; stdcall;
implementation
uses Windows;
function version() : Double;
var
s : String;
begin
result := 0.001;
end;
procedure DMesg( sText : WideString; sHead : WideString);
begin
Windows.MessageBoxW(0, PWideChar(sText), PWideChar(sHead), 0);
end;
function foo() : PWideString;
var s : WideString;
begin
s := 'My dog''s got fleas';
result := PWideString(s);
end;
end.
-- typelib
// This is the type library for BOSLAD.dll
[
// Use GUIDGEN.EXE to create the UUID that uniquely identifies
// this library on the user's system. NOTE: This must be done!!
uuid(0C55D7DA-0840-40c0-B77C-DC72BE9D109E),
// This helpstring defines how the library will appear in the
// References dialog of VB.
helpstring("BOSLAD TypeLib"),
// Assume standard English locale.
lcid(0x0409),
// Assign a version number to keep track of changes.
version(1.0)
]
library BOSLAD
{
// Now define the module that will "declare" your C functions.
[
helpstring("Functions in BOSLAD.DLL"),
version(1.0),
// Give the name of your DLL here.
dllname("BOSLAD.dll")
]
module BOSLADFunctions
{
[helpstring("version"), entry("version")] void __stdcall version( [out,retval] double* res );
[helpstring("DMesg"), entry("DMesg")] void __stdcall DMesg( [in] BSTR msg, [in] BSTR head );
[helpstring("foo"), entry("foo")] void __stdcall foo( [out,retval] BSTR* msg );
} // End of Module
}; // End of Library
我把WideString的声明从函数中移到了外部,希望能延长变量的生命周期,不仅局限于foo函数的生命周期。但这似乎没有任何影响。
同样地,我在VB6中注释掉了对foo函数的调用,但也没有任何影响。无论我做什么,当最后一行代码执行完毕后,VB6 IDE都会崩溃。
除了指向本地变量的指针之外,还有其他原因导致了这种情况。但是是什么呢?