相关疑难解决方法(0)

为什么WideString不能用作互操作的函数返回值?

我不止一次建议人们使用类型的返回值WideString进行互操作.

这个想法是a WideString和a一样BSTR.因为a BSTR是在共享COM堆上分配的,所以在一个模块中分配并在另一个模块中解除分配是没有问题的.这是因为所有各方都同意使用相同的堆,即COM堆.

但是,它似乎WideString不能用作互操作的函数返回值.

考虑以下Delphi DLL.

library WideStringTest;

uses
  ActiveX;

function TestWideString: WideString; stdcall;
begin
  Result := 'TestWideString';
end;

function TestBSTR: TBstr; stdcall;
begin
  Result := SysAllocString('TestBSTR');
end;

procedure TestWideStringOutParam(out str: WideString); stdcall;
begin
  str := 'TestWideStringOutParam';
end;

exports
  TestWideString, TestBSTR, TestWideStringOutParam;

begin
end.
Run Code Online (Sandbox Code Playgroud)

和以下C++代码:

typedef BSTR (__stdcall *Func)();
typedef void (__stdcall *OutParam)(BSTR &pstr);

HMODULE lib = LoadLibrary(DLLNAME);
Func TestWideString = (Func) GetProcAddress(lib, "TestWideString"); …
Run Code Online (Sandbox Code Playgroud)

delphi

48
推荐指数
2
解决办法
8541
查看次数

在IIS网络服务器上调用Delphi DLL的ASP.NET Web应用程序,在返回PChar字符串时锁定

如果我不返回任何内容,则工作正常,或者返回一个整数.但如果我试图返回一个PChar,即...

result := PChar('')  or   result:= PChar('Hello')
Run Code Online (Sandbox Code Playgroud)

网络应用程序只是冻结,我看着它的内存数量在任务管理器中逐渐变得越来越高.

奇怪的是,DLL在VStudio调试服务器或C#应用程序上运行良好.我唯一能想到的就是IIS服务器在64位Windows上运行.

它似乎不是一个兼容性问题,因为我可以成功写入文本文件并从DLL中执行其他操作...我只是不能返回一个PChar字符串.

尝试使用PWideChar,尝试返回'something\0',尝试了我能想到的一切.不幸的是没有运气.

[DllImport("TheLib.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
private static extern string SomeFunction();

string result = SomeFunction();
Run Code Online (Sandbox Code Playgroud)

德尔福:

library TheLib;

function SomeFunction() : PChar export; stdcall;
begin
return PChar('');
end;

exports
    SomeFunction
Run Code Online (Sandbox Code Playgroud)

c# delphi iis interop

4
推荐指数
1
解决办法
1978
查看次数

标签 统计

delphi ×2

c# ×1

iis ×1

interop ×1