DLLのインポートについて – プログラミング – Home

DLLのインポートについて
 
通知
すべてクリア

DLLのインポートについて

固定ページ 1 / 2

mmm
 mmm
(@mmm)
ゲスト
結合: 19年前
投稿: 10
Topic starter  

初めまして。vc初心者です。SDK勉強中です
あるメーカーからデータ読み込み用のAPIを頂きました。
資料によると以下の内容でした。

//xxx.h
#ifdef DATAFILE_EXPORTS
#define DATAFILE_API __declspec(dllexport)
#else
#define DATAFILE_API __declspec(dllimport)
#endif

//DATAFILE.h
enum File_TYPE {AAA = 0};
DATAFILEI_API BOOL WINAPI OpenData(LPCTSTR lpFileName, ULONG ulFileType);

//API名(adddef.dll)
BOOL WINAPI OpenData(LPCTSTR lpFileName, ULONG ulFileType);
lpFileName: ファイル名
File_TYPE: ファイルタイプ(AAA = 0)
戻り値:正常時 TRUE

このDLLを利用してデータファイルを開き、TRUEが戻ってくるかテストしていますが
らららのホームページや猫でもわかるプログラミングで参照して

//test.c
#include windows.h
#include stdio.h

typedef BOOL(WINAPI* *MYFUNC)(LPCTSTR lpFileName, ULONG ulFileType);
MYFUNC pFunc;

void main()
{
HINSTANCE hDLL;

hDLL = LoadLibrary(adddef); // DLLのロード
if (hDLL != NULL)
{
pFunc = (MYFUNC)GetProcAddress(hDLL,?add@xcvfdg); // 関数ポインタ取

if (!pFunc)
{
FreeLibrary(hDLL); // 解放
return;
}
ret = (*pFunc)(c:\\test.dat,0);
sprintf(str,%d,ret);
MessageBox(NULL,str,メッセージ,MB_OK);
}
FreeLibrary(hDLL);
}

として見たのですが、「アプリケーションエラー・・・メモリがreadになることはありませんでした」の
エラーが表示してうまく行きません。
どこがどうおかしいのか理解出来ません。
どなたか分かる方初心者の私に教えていただけないでしょうか?


引用解決済
トピックタグ
KING・王
 KING・王
(@KING・王)
ゲスト
結合: 20年前
投稿: 122
 

> として見たのですが、「アプリケーションエラー・・・メモリがreadになることはあり
ませんでした」の
> エラーが表示してうまく行きません。
プログラムのどの行を実行したときに、このエラーが発生しましたか?

ぱっと見、気になったのは、関数ポインタの使い方も間違っているような気が。


返信引用
mmm
 mmm
(@mmm)
ゲスト
結合: 19年前
投稿: 10
Topic starter  

mmmです。早速のレスありがとうございます。
pFunc = (MYFUNC)GetProcAddress(hDLL,?add@xcvfdg);
のpFuncはなにやら245631とか数字が入っているようです。(0以外)
ret = (*pFunc)(c:\\test.dat,0);
を実行後エラーになっているようです。
よろしくお願いします。


返信引用
KING・王
 KING・王
(@KING・王)
ゲスト
結合: 20年前
投稿: 122
 

> ret = (*pFunc)(c:\\test.dat,0);
> を実行後エラーになっているようです。

だったっら、やっぱり関数ポインタの使い方が間違っているのかな。

とりあえず、適当にGoogleで検索したのですが、下記ページを参考に、試してみてくださ
い。

> http://www2.muroran-it.ac.jp/circle/mpc/old/qanda/prog0000.html


返信引用
mmm
 mmm
(@mmm)
ゲスト
結合: 19年前
投稿: 10
Topic starter  

LPCTSTR lpFileName に 直接 c:\\test.dat と
入力していいんでしょうか?
どこかのHPみたら、lpFileName は文字列のポインタとか
書いてありました。
でも、sprintf(filename ,c:\\test.dat);
ret = (*pFunc)(filename 0);でも×
typedef BOOL(*POPENDATA)(LPCTSTR *, DWORD);
ret = (*pFunc)(&filename 0);だと戻り値0です。
やっぱり基本的にポインタの勉強をしないと駄目みたいです。


返信引用
KING・王
 KING・王
(@KING・王)
ゲスト
結合: 20年前
投稿: 122
 

> LPCTSTR lpFileName に 直接 c:\\test.dat と
> 入力していいんでしょうか?
> どこかのHPみたら、lpFileName は文字列のポインタとか
> 書いてありました。

あまり自信がないのですが・・・
直接 c:\\test.datとすると、まずc:\\test.datという文字列が、
文字リテラル(?)として作成され、c:\\test.datとした部分には、
その文字リテラルへのポインタとなります。
#識者の方、詳細のフォローお願いします。

え~と、とりあえず、私の示したリンク先などは見ていただけましたか?
そこを見ると、関数ポインタの使い方が間違っているようなのですが。。。


返信引用
mmm
 mmm
(@mmm)
ゲスト
結合: 19年前
投稿: 10
Topic starter  

すいません
ret = (*pFunc)(&filename 0);だと
この関数内でfilename名を取得する事になるような
気がしますので、戻り値0になるのかな?
もうちょっと、
http://www2.muroran-it.ac.jp/circle/mpc/old/qanda/prog0000.html
のリンク先やC言語の本を読み直して
関数ポインタの使い方を勉強してみます。


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

> typedef BOOL(WINAPI* *MYFUNC)(LPCTSTR lpFileName, ULONG ulFileType);

既に指摘されてますが、'*'がひとつ余分では?

> LPCTSTR lpFileName に 直接 c:\\test.dat と
> 入力していいんでしょうか?

'T'と書いてある以上、TCHARが要求されてますから、だめでしょう。
少なくとも、TEXT(c:\\test.dat) または _T(c:\\test.dat)。
# 逆に言えば、TCHARになってればリテラルを直接書いてもオッケーです。


返信引用
KING・王
 KING・王
(@KING・王)
ゲスト
結合: 20年前
投稿: 122
 

はぁ~。
私が指摘しているのは、とりあえず、リンク先の2つ目の白抜きの部分の2行目を見て、
mmmさんが記載されている
> ret = (*pFunc)(c:\\test.dat,0);
と比較してみてくださいということです。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

typedef BOOL ( WINAPI *MYFUNC )( LPCTSTR, ULONG );

pFunc = ( MYFUNC )GetProcAddress( hDLL, OpenData );
TCHAR filename[] = c:\\test.dat;
ret = ( *pFunc )( filename, 0 );

としてもダメでしょうか?


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

_Tマクロが抜けていました。
> TCHAR filename[] = c:\\test.dat;
TCHAR filename[] = _T( c:\\test.dat );


返信引用
mmm
 mmm
(@mmm)
ゲスト
結合: 19年前
投稿: 10
Topic starter  

KING・王さん、Blueさん レスありがとうございます。

Blueさんの指摘の様に実行してみましたが

c:\tmp\vc_project\test3\xxxx.c(52) : error C2275: 'TCHAR' : typedef 識別子に、クラ
ス メンバ アクセス演算子 (->) を使用しました。
c:\program files\microsoft visual studio\vc98\include\winnt.h(189) : 'TCHAR' の
宣言を確認してください。

とエラーが表示されます。根本的にtypedefとかTCHARの意味を完全には
把握しきれていないので(勉強不足)自分であーこうすればいいのかー
という風に出来ません。
申し訳ありません。よろしくご指導お願いします。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

#include <tchar.h>
を入れたらどうなりますか?


返信引用
mmm
 mmm
(@mmm)
ゲスト
結合: 19年前
投稿: 10
Topic starter  

Blueさん、ありがとうございます。

#include <tchar.h>をインクルードしても駄目でした。

もしかしてMFCでないとエラーになるとかあるんでしょうか

申し訳ありません。よろしくご指導お願いします。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

> もしかしてMFCでないとエラーになるとかあるんでしょうか
そんなことないはずですが。。。

とりあえず、修正したソースを再度載せてもらえますでしょうか?
エラーが出た場合は、お手数ですがもう一度貼ってください。

それと、
>#include windows.h
>#include stdio.h
一応
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
のほうが良いと思います。
# ~と<~>の違いはヘッダファイルの探し方です。詳しくはMSDNで。

> void main()
も、
int main( void ) か int main( int argc, char* argv[] )
として,戻り値を返すようにしたほうがベターです。
参考)
ロベールのC++教室 - 第41章 私はαでありωである -
http://www1.kcn.ne.jp/~robe/cpphtml/html03/cpp03041.html


返信引用
固定ページ 1 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました