错误类型:出错误尝试读取或写入受保护的内存。这通常指示其他内存已损坏。C#源码
[DllImport("Base64.dll")]
public static extern string Base64ToStr(string Base64);protected void Page_Load(object sender, EventArgs e)
{
    Response.Write(Base64ToStr("YWRtaW4="));
}
delphi 源码unit Base;interfaceuses ShareMem,SysUtils, Classes;// 将SourceSize长度的源Source编码为Base64字符串返回
function Base64Encode(const Source; SourceSize: Integer): string; overload;
// 将Source从StartPos开始的Size长度的内容源编码为Base64,写入流Dest。Size=0文件结束
procedure Base64Encode(Source, Dest: TStream; StartPos: Int64 = 0; Size: Int64 = 0); overload;
// 把字符串Str编码为Base64字符串返回
function StrToBase64(Str: string): string;stdcall;// 按给定的编码源Source和长度Size计算并返回解码缓冲区实际所需长度
function Base64DecodeBufSize(const Source; Size: Integer): Integer;
// 将Base64编码字符串Source解码存放在Buf中,返回解码长度
function Base64Decode(const Source: string; var Buf): Integer; overload;
// 将Source从StartPos开始的Size长度的Base64编码内容解码,写入流Dest。Size=0文件结束
procedure Base64Decode(Source, Dest: TStream; StartPos: Int64 = 0; Size: Int64 = 0); overload;
// 把Base64字符串解码为字符串返回
function Base64ToStr(Base64: string): string;stdcall;implementationconst
  Base64_Chars: array[0..63] of char = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
  Base64_Bytes: array[0..79] of byte = (
    62, 0, 0, 0, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,
    0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7,
    8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
    23, 24, 25, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 30, 31,
    32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46,
    47, 48, 49, 50, 51
  );
  
type
  Base64Proc = function(const Source; var Buf; SourceSize: Integer): Integer;function Base64_Encode(const Source; var Buf; SourceSize: Integer): Integer;
asm
  push  ebp
  push  esi
  push  edi
  push  ebx
  mov   esi, eax         // esi = Source
  mov   edi, edx         // edi = Buf
  mov   eax, ecx
  cdq
  mov   ecx, 3
  div   ecx
  mov   ecx, eax
  test  edx, edx         // edx = SourceSize % 3
  jz    @@1
  inc   eax              // eax = (SourceSize + 2) / 3
@@1:
  push  eax
  push  edx
  lea   ebp, Base64_Chars// ebp = Base64_Chars
  jecxz @@3
  cld                    // for (ecx = SourceSize / 3; ecx > 0; ecx --)
@Loop1:                  // {
  mov   edx, [esi]       //   edx = *(DWORD* )esi
  add   esi, 3           //   esi += 3
  bswap edx              //   bswap(edx)
  shr   edx, 8           //   edx >>= 8
  mov   ebx, edi         //   ebx = edi
  add   edi, 4           //   edi += 4
@Loop3:                  //   while (ebx != edi)
  dec   edi              //   {
  mov   eax, edx         //     *--edi = (BYTE)Base64_Chars[edx & 63]
  and   eax, 63
  movzx eax, byte ptr [ebp + eax]
  mov   [edi], al
  shr   edx, 6           //     edx >= 6
  cmp   ebx, edi
  jne   @Loop3           //   }
  add   edi, 4           //   edi += 4
  loop  @Loop1           // }
@@3:
  pop   ecx              // if (SourceSize % 3 == 0)
  jecxz @end             //   return
  push  ecx
  mov   eax, ecx
  mov   ebx, 0ffffffffh  // ebx = ~(-1 >> ((SourceSize % 3) * 8))
  shl   ecx, 3
  shl   ebx, cl
  not   ebx
  mov   edx, [esi]       // edx = *(DWORD* )esi & ebx
  and   edx, ebx
  bswap edx              // bswap(edx)
  mov   ecx, eax
  inc   ecx
@Loop4:                  // for (ecx = SourceSize % 3 + 1; ecx > 0; ecx --)
  rol   edx, 6           // {
  mov   eax, edx         //   edx <<<= 6
  and   eax, 63          //   *edi ++ = Base64_Chars[edx & 63]
  movzx eax, [ebp + eax]
  stosb
  loop  @Loop4           // }
  pop   ecx              // for (ecx = 3 - (SourceSize % 3); ecx > 0; ecx --)
  xor   ecx, 3
  mov   al, 61
  rep   stosb            //   *edi++ = '='
@end:
  pop   eax
  shl   eax, 2           // return (SourceSize + 2) / 3 * 4
  pop   ebx
  pop   edi
  pop   esi
  pop   ebp
end;function Base64Encode(const Source; SourceSize: Integer): string;
begin
  SetLength(Result, ((SourceSize + 2) div 3) shl 2);
  Base64_Encode(Source, Result[1], SourceSize);
end;procedure Base64Stream(Source, Dest: TStream; Proc: Base64Proc;
  StartPos, Size: Int64; RBufSize, WBufSize: Integer);
var
  RBuf: array of Byte;
  WBuf: array of Byte;
  RSize, WSize: Integer;
begin
  if (StartPos < 0) or (StartPos >= Source.Size) then Exit;
  Source.Position := StartPos;
  if (Size <= 0) or (Size > Source.Size - Source.Position) then
    Size := Source.Size
  else
    Size := Size + Source.Position;
  SetLength(RBuf, RBufSize);
  SetLength(WBuf, WBufSize);
  while Size <> Source.Position do
  begin
    RSize := Source.Read(RBuf[0], RBufSize);
    WSize := Proc(RBuf[0], WBuf[0], RSize);
    Dest.Write(WBuf[0], WSize);
  end;
end;procedure Base64Encode(Source, Dest: TStream; StartPos: Int64; Size: Int64);
begin
  Base64Stream(Source, Dest, Base64_Encode, StartPos, Size, 3072, 4096);
end;function StrToBase64(Str: string): string;
begin
  Result := Base64Encode(Str[1], Length(Str));
end;function Base64DecodeBufSize(const Source; Size: Integer): Integer;
asm
  push  edi
  mov   edi, eax    // edi = Source + Size - 1
  add   edi, edx
  mov   eax, edx    // eax = Size / 4 * 3
  shr   edx, 2
  shr   eax, 1
  add   eax, edx
  mov   edx, eax
  jz    @@2
@@1:
  dec   edi
  cmp   byte ptr [edi], 61
  jne   @@2         // if ([edi] == '=')
  dec   eax         //   eax --
  jmp   @@1
@@2:
  pop   edi         // return eax: BufSize; edx: SourceSize / 4 * 3
end;function Base64_Decode(const Source; var Buf; SourceSize: Integer): Integer;
asm
  push  ebp
  push  esi
  push  edi
  push  ebx
  mov   esi, eax       // esi = Source
  mov   edi, edx       // edi = Buf
  mov   edx, ecx
  call  Base64DecodeBufSize
  push  eax            // eax = Base64DecodeBufSize(Source, SourceSize)  // return value
  add   eax, edi       // eax += edi
  lea   ebp, Base64_Bytes
  cld
  shr   ecx, 2
  jecxz @end
  push  eax
  mov   ebx, ecx       // for (ebx = SourceSize / 4; ebx > 0; ebx --; edi += 3)
@Loop1:                // {
  mov   ecx, 4         
  xor   eax, eax       //   for (ecx = 4, eax = 0; ecx > 0; ecx --)
@Loop2:                //   {
  movzx edx, byte ptr [esi]
  inc   esi            //      edx = *esi ++
  sub   edx, 43        //      dl -= 43
  shl   eax, 6         //      eax <<= 6
  or    al, [ebp + edx]//      al |= Base64_Bytes[edx]
  loop  @Loop2         //   }
  cmp   ebx, 1         //   if (ebx == 1) break
  jz    @@2
  bswap eax            //   bswap(eax)
  shr   eax, 8         //   eax >>= 8
  mov   [edi], ax      //   *edi = ax
  shr   eax, 16        //   eax >>= 16
  mov   [edi + 2], al  //   *(edi + 2) = al
  add   edi, 3         //
  dec   ebx
  jnz   @Loop1         // }
@@2:
  pop   ecx            // for (ecx = Buf + BufSize, eax <<= 8; edi != ecx;)
  shl   eax, 8         // {
@Loop4:
  cmp   edi, ecx
  je    @end
  rol   eax, 8         //   eax <<<= 8
  stosb                //   *edi ++ = al
  jmp   @Loop4         // }
@end:
  pop   eax            // return eax
  pop   ebx
  pop   edi
  pop   esi
  pop   ebp
end;function Base64Decode(const Source: string; var Buf): Integer;
begin
  Result := Base64_Decode(Source[1], Buf, Length(Source));
end;procedure Base64Decode(Source, Dest: TStream; StartPos: Int64; Size: Int64);
begin
  Base64Stream(Source, Dest, Base64_Decode, StartPos, Size, 4096, 3072);
end;function Base64ToStr(Base64: string): string;
begin
  SetLength(Result, Base64DecodeBufSize(Base64, Length(Base64)));
  Base64_Decode(Base64[1], Result[1], Length(Base64));
end;end.
看红色的就行

解决方案 »

  1.   

    function MyStrCat(s1:pchar;s2:pchar): pchar; stdcall;
    var
    Buffer:pchar;
    begin
      GetMem(Buffer,255);
      StrCopy(Buffer,s1);
      StrCat(Buffer, s2);
      result:=Buffer;
    end;把输入参数和返回值换成pchar试试
      

  2.   

    记得好像在哪里看到过,说其他语言调用delphi dll需要用pchar的http://www.mybuffet.cn
      

  3.   

    Delphi与.NET是有你无我的关系,,,微软的产品与很多的产品都是互斥的
    要么你用Delphi,也是很不错的产品
    要么你就用微软的产品,
      

  4.   

    delphi的string的0元素是字符个数,与C#的不一样,不能直接对应。不知道能否用byte[],没装delphi,不能试。或者你参照1楼,字符串用pchar