Я впервые попробовал написать DLL в Delphi. Все идет нормально. Используя typelib, я без труда смог передать Widestrings в и из DLL.
Что сейчас любопытно, так это то, что я использую 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 умирает после выполнения последней строки кода.
Причиной является что-то кроме указателей на локальные переменные. Но что?