Windows XPからWin Vistaに移行して、以前に動作していた2つのDLLを持つDelphi 5アプリケーション

私は2 DLLを呼び出すDelphi 5のアプリケーションがあります。これはでうまく動作します。 Win XPでexe。しかし、メインプロセスの最後にあるDLLのコードでIDEを操作すると、 "連続した例外が多すぎます" というエラーが表示されます。 ファイル内にもあります。 Windows Vistaのexeは、「Sistema XXXが動作を停止しました」というエラーをマークします。これは、IDEで同じことが起きた可能性があります

これはコードメインです

unit DLLNiuxExplicit;

interface

const
  DLL_ModPpto = 'LIB_Pptos_Oper.dll';        //DLL Modulo Presupuesto
  DLL_ModCFD  = 'Prj_FE_Niux.dll';           //DLL Modulo Factura Electronica

var
{Variables de la funciones a utilizar en el proyecto}
  Configuracion : function (No_Orden : Integer; pathBD : WideString; PathDbConfig : Widestring) : Integer ; stdcall;
  Cotizar : function (No_Orden : Integer; pathBD : Widestring; PathDbConfig : Widestring) : Integer ; stdcall;
  GeneraCFD : function(No_Orden : Integer; PathBD : WideString; FechaLocal : WideString) : Integer ; stdcall;
  ImprimeCFD : function(BaseDatos : Widestring; No_Orden : Integer; Prefijo : WideString; No_Factura : Integer; Imprime : Boolean) : Boolean ; Stdcall;
  Fin_DLL_ModPpto : procedure stdcall;
  Fin_DLL_ModCFD : procedure stdcall;

implementation
uses
  Windows, Dialogs;
var
{Handles de Librerias}
  HLib : Cardinal;           //Handle de DLL del Modulo de Presupuestos
  HLibCFD : Cardinal;         //handle de DLL del Modulo de Factura Electronica
initialization
  HLib := LoadLibrary(DLL_ModPPto);
  if HLib <= 32 then
    MessageBox(0, 'Error : No puedo Cargar ' + DLL_ModPpto, 'Oops', MB_OK)
  else
    begin
      Configuracion := GetprocAddress(HLib, 'Modulo_PPtos_Configuracion');
      if not Assigned(Configuracion) then
        MessageBox(0, 'Error : No se Encontro la Funcion MODULO_PPTOS_CONFIGURACION ' ,'Oops', MB_OK);

      Cotizar := GetprocAddress(HLib, 'Modulo_Pptos_Operacion');
      if not Assigned(Cotizar) then
        MessageBox(0, 'Error : No se Encontro la Funcion MODULO_PPTOS_OPERACION ' ,'Oops', MB_OK);

      Fin_DLL_ModPpto := GetprocAddress(HLib, 'Fin_Lib_PPtos_Oper');
      if not Assigned(Fin_DLL_ModPpto) then
        MessageBox(0, 'Error : No se Encontro la Funcion Fin_Lib_PPtos_Oper ' ,'Oops', MB_OK);

    end;

  HLibCFD := LoadLibrary(DLL_ModCFD);
  if HLibCFD <= 32 then
    MessageBox(0, 'Error : No puedo Cargar ' + DLL_ModCFD, 'Oops', MB_OK)
  else
    begin
      GeneraCFD := GetprocAddress(HLibCFD, 'GenCFD');
      if not Assigned(GeneraCFD) then
        MessageBox(0, 'Error : No se Encontro la Funcion GenCFD ' ,'Oops', MB_OK);

      ImprimeCFD := GetprocAddress(HLibCFD, 'Prn_Factura');
      if not Assigned(ImprimeCFD) then
        MessageBox(0, 'Error : No se Encontro la Funcion Prn_Factura ' ,'Oops', MB_OK);

      Fin_DLL_ModCFD := GetprocAddress(HLibCFD, 'Fin_Prj_Fe_Niux');
      if not Assigned(Fin_DLL_ModCFD) then
        MessageBox(0, 'Error : No se Encontro la Funcion Fin_Prj_Fe_Niux ' ,'Oops', MB_OK);

    end;

finalization
  Fin_DLL_ModPpto;
  Fin_DLL_ModCFD;
  FreeLibrary(HLib);
  FreeLibrary(HLibCFD);
end.

これが最終コードです

procedure TFMain.SalidaExecute(Sender: TObject);
begin
   // Fin_DLL_ModPpto;
   // Fin_DLL_ModCFD;
      Close;
end;

これが最終コードです of a DLL, both DLL are similar on functions

unit UFin_Lib_PPtos_Oper

interface
uses
  Sysutils;

procedure Fin_Lib_PPtos_Oper;

Exports Fin_Lib_PPtos_Oper;

implementation
uses
  UDmDatos,
  UPPtos_Oper,
  UCondiguracion;

procedure Fin_Lib_PPtos_Oper;
begin
  if assigned(DmDatos) then
   FreeAndNil(DmDatos);
  if assigned(Frm_PPtos_Oper) then
   FreeAndNil(Frm_PPtos_Oper);
  if assigned(frm_configuracion) then
   FreeAndNil(frm_configuracion);
end;

end.
2
DmDatos、Frm_PPtos_Oper、およびfrm_configurationとは何ですか?そこに何かクラッシュする可能性がありますか?コード内のコメントに英語を使用できますか?また、try..exceptやtry..finallyブロックを使用して例外をキャッチすることを確認する必要があります。特に、DLL内からVCLを使用して再生する場合は例外です。
追加された 著者 Jerry Dodge,
ここには奇妙なことがたくさんあります。あなたのタイプはオフです。枢機卿ではなくHMODULEを使用してください。 <= 32が間違っています。エラー条件は= NULLです。ここで欠けているのは、フォーム変数の作成です。私はこのようなDLLでVCLコードを使用することは非常に疑念です。
追加された 著者 David Heffernan,
投稿されたコードは意味をなさないが、エラーはかなり明確です。あなたはDLLコードでゼロ例外処理を持っています。 いいえ例外がDLLに未処理のまま残るようにする必要があります。おそらく例外を発生させる可能性があるすべてのものの周りに try..except ブロックが必要で、適切な方法で例外を処理する必要があります。 DLLが問題をアプリケーションに通知する必要がある場合、期待どおりに動作しないときにエラーコードを返す必要があります。
追加された 著者 Ken White,
DmdatosはTdataModule、Frm_PPtos_Oper、およびfrm_configurationはTFormsです。この関数は、メインアプリケーションの最後のブロックが呼び出されたときに動的に作成され、try ... exceptを渡して同じエラーを送信します。 try ... exceptを使ってDLLのブロック出力に同じ変更を加えました。また、hModule基底[code] try//Fin_DLL_ModPptoを変更します。//Fin_DLL_ModCFD;閉じる; E:Exception do ShowMessage( 'Error al Finalizar DLL:' + E.message);例外はありません。 [コード]
追加された 著者 Francisco Banda,

答えはありません

0