初めまして。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になることはありませんでした」の
エラーが表示してうまく行きません。
どこがどうおかしいのか理解出来ません。
どなたか分かる方初心者の私に教えていただけないでしょうか?
> として見たのですが、「アプリケーションエラー・・・メモリがreadになることはあり
ませんでした」の
> エラーが表示してうまく行きません。
プログラムのどの行を実行したときに、このエラーが発生しましたか?
ぱっと見、気になったのは、関数ポインタの使い方も間違っているような気が。
mmmです。早速のレスありがとうございます。
pFunc = (MYFUNC)GetProcAddress(hDLL,?add@xcvfdg);
のpFuncはなにやら245631とか数字が入っているようです。(0以外)
ret = (*pFunc)(c:\\test.dat,0);
を実行後エラーになっているようです。
よろしくお願いします。
> ret = (*pFunc)(c:\\test.dat,0);
> を実行後エラーになっているようです。
だったっら、やっぱり関数ポインタの使い方が間違っているのかな。
とりあえず、適当にGoogleで検索したのですが、下記ページを参考に、試してみてくださ
い。
> http://www2.muroran-it.ac.jp/circle/mpc/old/qanda/prog0000.html
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です。
やっぱり基本的にポインタの勉強をしないと駄目みたいです。
> LPCTSTR lpFileName に 直接 c:\\test.dat と
> 入力していいんでしょうか?
> どこかのHPみたら、lpFileName は文字列のポインタとか
> 書いてありました。
あまり自信がないのですが・・・
直接 c:\\test.datとすると、まずc:\\test.datという文字列が、
文字リテラル(?)として作成され、c:\\test.datとした部分には、
その文字リテラルへのポインタとなります。
#識者の方、詳細のフォローお願いします。
え~と、とりあえず、私の示したリンク先などは見ていただけましたか?
そこを見ると、関数ポインタの使い方が間違っているようなのですが。。。
すいません
ret = (*pFunc)(&filename 0);だと
この関数内でfilename名を取得する事になるような
気がしますので、戻り値0になるのかな?
もうちょっと、
http://www2.muroran-it.ac.jp/circle/mpc/old/qanda/prog0000.html
のリンク先やC言語の本を読み直して
関数ポインタの使い方を勉強してみます。
> typedef BOOL(WINAPI* *MYFUNC)(LPCTSTR lpFileName, ULONG ulFileType);
既に指摘されてますが、'*'がひとつ余分では?
> LPCTSTR lpFileName に 直接 c:\\test.dat と
> 入力していいんでしょうか?
'T'と書いてある以上、TCHARが要求されてますから、だめでしょう。
少なくとも、TEXT(c:\\test.dat) または _T(c:\\test.dat)。
# 逆に言えば、TCHARになってればリテラルを直接書いてもオッケーです。
はぁ~。
私が指摘しているのは、とりあえず、リンク先の2つ目の白抜きの部分の2行目を見て、
mmmさんが記載されている
> ret = (*pFunc)(c:\\test.dat,0);
と比較してみてくださいということです。
typedef BOOL ( WINAPI *MYFUNC )( LPCTSTR, ULONG );
pFunc = ( MYFUNC )GetProcAddress( hDLL, OpenData );
TCHAR filename[] = c:\\test.dat;
ret = ( *pFunc )( filename, 0 );
としてもダメでしょうか?
_Tマクロが抜けていました。
> TCHAR filename[] = c:\\test.dat;
TCHAR filename[] = _T( c:\\test.dat );
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の意味を完全には
把握しきれていないので(勉強不足)自分であーこうすればいいのかー
という風に出来ません。
申し訳ありません。よろしくご指導お願いします。
#include <tchar.h>
を入れたらどうなりますか?
Blueさん、ありがとうございます。
#include <tchar.h>をインクルードしても駄目でした。
もしかしてMFCでないとエラーになるとかあるんでしょうか
申し訳ありません。よろしくご指導お願いします。
> もしかして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