2011-12-08 5 views
0

잘 작동하는 앱이 있습니다 ... DLL로 구현되도록 이식합니다. 데이터베이스 및 TTable 구성 요소가있는 데이터 모듈이 있습니다 ... 디자인 모드에서 데이터베이스는 활성으로 설정됩니다. 테이블은 데이터베이스를 가리키며 활성으로 설정됩니다. 테이블을 마우스 오른쪽 버튼으로 클릭하고 필드 편집기로 이동하여 모든 열을 볼 수 있으므로 구조체/속성이 올바르게 설정되었음을 알 수 있습니다 ....Delphi - DLL의 DataModule에서 TTable을 사용하는 중 오류가 발생했습니다.

문제는 런타임에 ... It 내게는 DLL 내부 데이터 모듈을 사용하기 위해 수행해야 할 특별한 무언가가 있다는 것을 웹에서 힌트를 보았다

if MyDataModule.DB1.Connected = True then 
    ShowMessage('Active') 
    else 
ShowMessage('Not Active'); 

이 라인에 AV를 ... 제공하지만, 나는 일을 아무것도 못하고 있어요 .

특정 오류 메시지는 다음과 같습니다 모듈의 주소 06D4E22E에서

액세스 위반 'DocAssistCom.dll'읽기 주소의 0000070 '

+3

데이터 모듈을 사용하기 전에 인스턴스를 만들고 있습니까? – RRUZ

+1

@RRUZ가 지적했듯이, (프로젝트 소스를 보면) 데이터 모듈 (VCL 폼 애플리케이션에 추가 될 때)이 자동으로 생성되는 반면 dll을 생성하면 데이터 모듈의 인스턴스를 수동으로 생성해야합니다 데이터베이스에 액세스하는 등의 구성 요소 호출이 가능합니다. – ComputerSaysNo

+1

나중에 참조 할 때 참고하십시오 : 손가락에 'AV', '액세스 위반', '오류'또는 '예외'라는 구를 입력 할 때마다 다음에해야 할 일 입력을 시작하면 ** 정확한 ** 오류 메시지 (메모리 주소 또는 오류 코드 포함)가 표시됩니다. "내게 AV를 준다"고 말하면서 문제를 해결하는 데 도움이되는 사람들에게는 절대 쓸모가 없다. 오류 메시지는 상황을 엄청나게 빠르게 할 수 있습니다 (비록 무의미한 경우 라 할지라도) 솔루션을 훨씬 빨리 얻을 수 있습니다. 감사. :) –

답변

4

당신은 다음, MyDaModule가 실제로 만들어집니다 MyDataModule.DB1을 확인한다 심지어는 MyDataModule.DB1.Connected을 사용하기 전에 만들어진 것입니다.

if Assigned(MyDataModule) then 
    if Assigned(MyDataModule.DB1) then 
    if MyDataModule.DB1.Connected = True then 
     ShowMessage('Active') 
    else 
     ShowMessage('Not Active') 
    else 
    ShowMessage('MyDataModule.DB1 not assigned') 
else 
    ShowMessage('MyDataModule not assigned'); 

그러나 사용하려고 할 때 아직 완전히 만들어지지 않을 수도 있습니다. 대신 주위 ShowMessage 전화를 확산의

그래서, 차라리

주 ... 코드 경로를 확인하기 위해 IDEOutputDebugstring디버그 DLL을 사용합니다 : 나도 몰라하는 Delphi 및 Windows 버전을 사용하고 있지만 TTable에 BDE (요즘에는 사용되지 않음)가 필요하다는 것을 알고 있어야합니다 ...

+0

DataModule이 할당되지 않았습니다 .... 아직 DataModule.OnCreate 이벤트에서 메시지가 나타납니다. DM 변수를 전역 변수로 설정했지만이 .pas 파일은 "볼"수 없지만 잘 컴파일됩니다. OutputDebugString에 관해서는 들어 보지 못했습니다 ... 잘 알고 있습니다 ... – user1009073

+0

해결 : 데이터 모듈을 수동으로 만들어야했고 USES 절에서 MyDataModule.pas 파일을 제거해야했습니다. 범위 지정 문제의 일부 유형도 들어 왔습니다. – user1009073

+0

유닛에있는 동일한 전역 MyDataModule 변수 이름을 다시 사용하고 있습니까? –